我是靠谱客的博主 满意小伙,最近开发中收集的这篇文章主要介绍学汇编,记笔记(七)_《汇编语言(第4版)》王爽著——数据处理的基本问题_寻址_div除法_伪指令dd和dup前言一、bx、bp和si、di二、表达一个数据的位置三、寻址方式四、伪指令dd五、指定数据长度六、dup批量声明数据七、div除法后记,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

前言

学习教材:《汇编语言(第4版)》王爽著
此笔记是书中内容+自我总结,方便查阅和复习
请支持原著

约定reg和sreg符号

reg(Register)表示一般寄存器,sreg(Segment Register)表示段寄存器

符号描述
regax、bx、cx、dx(以及高低两部分)、sp、bp、si、di
sregds、ss、cs、es

数据处理的两个基本问题

  1. 待处理数据的位置
  2. 待处理数据的长度

CPU在数据处理的过程只关在意以上两个问题,而不在意数据具体值是多少

文章目录

  • 前言
    • 约定reg和sreg符号
    • 数据处理的两个基本问题
  • 一、bx、bp和si、di
  • 二、表达一个数据的位置
    • Ⅰ、立即数——idata
    • Ⅱ、寄存器——reg
    • Ⅲ、段地址和偏移地址——SA:EA
    • immediate operand not allowed
  • 三、寻址方式
  • 四、伪指令dd
  • 五、指定数据长度
    • Ⅰ、以寄存器大小定长度
    • Ⅱ、以操作符X ptr定长度
    • Ⅲ、其他方法
  • 六、dup批量声明数据
  • 七、div除法
    • Ⅰ、除法的四要素
    • Ⅱ、div的格式
  • 后记

章末实验

一、bx、bp和si、di

前面提到,可以通过[bx+si+idata]形式定位内存单元。完整地,以[…]寻址的寻址形式如下:

[bx/bp+si/di+idata],其中,任意位置均能为0省略不写

bx和bp区别在于:使用bx,段地址匹配ds;使用bp,段地址匹配ss

二、表达一个数据的位置

通常用以下三个概念表达数据的位置

Ⅰ、立即数——idata

代码中直接给出的数据称为立即数,执行前已经存在CPU的指令缓冲器内

mov ax,1
mov al,'a'

Ⅱ、寄存器——reg

数据存在寄存器内,直接给出寄存器名字

Ⅲ、段地址和偏移地址——SA:EA

数据存在内存内,直接给出地址。地址可以是立即数也可以是寄存器中的数据,用[X]表示

对于地址存放在寄存器中,描述 该地址存放的地址 可以有显性给出或隐性给出,即是否指定段寄存器

  • 显性给出:sreg:[reg]、sreg:[bx/bp+si/di+idata]
  • 隐性给出:[reg]、[bx/bp+si/di+idata]

immediate operand not allowed

见下文链接

immediate operand not allowed问题解析

三、寻址方式

寻址方式有五种:

寻址方式描述
直接寻址[idata]
寄存器间接寻址[bx/bp/di/si]
寄存器相对寻址[bx/bp/di/si+idata]及其多种写法
基址变址寻址[bx/bp+di/si]及其多种写法
相对基址变址寻址[bx/bp+di/si+idata]及其多种写法

四、伪指令dd

前面用过db和dw

  • db:字节型数据
  • dw:字型数据

dd是双字型(dword,double word)数据,占据4B,32位

五、指定数据长度

在C中使用int、long等指定数据的长度,具体到汇编中,有以下三种方式指定:

Ⅰ、以寄存器大小定长度

寄存器是几位的,数据就有多长,分八位和十六位

Ⅱ、以操作符X ptr定长度

若数据存储在内存中,就需要用X ptr定长度,X可选word或byte

  • byte ptr,字节型,大小1B
mov byte ptr ds[0]:1 ;令ds:[0]=00
  • word ptr,字型,大小2B
mov word ptr ds[0]:1 ;令ds:[0]和ds:[1]=01和00

Ⅲ、其他方法

如:对于push出栈,默认对字型操作

六、dup批量声明数据

dup用于批量声明同类型数据,用法如下:

db/dw/dd n dup (data1,data2,…)

使用dup可以迅速获得多个重复的数据

  • 空栈:
stack segment
	dw 200 dup (0)
stack ends
  • 重复数据:
db 3 dup (0,1,2)

七、div除法

Ⅰ、除法的四要素

类比除法的标准形式,div除法的四要素:

  • 被除数:默认放在ax和dx或ax中,区别为除数为十六位和八位,高位放在dx或ah,低位放在ax或al
  • 除数:有十六位和八位两种,对应被除数三十二位和十六位,放在reg或内存中
  • 商:运算后放在低位ax或al中
  • 余数:运算后放在高位dx或ah中

低位存商,高位存余数
被除数位数是除数位数的2倍

除数有几位就被称为几位除法

要素类型16位除法8位除法
被除数32位,dx存高位ax存低位16位,ah存高位al存低位
除数16位8位
存放在低位ax存放在低位al
余数存放在高位dx存放在高位ah

Ⅱ、div的格式

  • div reg
  • div SA:EA

编程,利用除法指令计算100001/100和1001/100,其中100001=186A1H

前者的被除数大于65535,后者的被除数小于65535,前者16位除法后者8位除法
实现代码分别如下:

mov dx,1
mov ax,186A1H ;共32位
mov bx,100 ;共16位
div bx
mov ax,1001 ;共16位
mov bl,100 ;共8位
div bl

运算后查看对应的寄存器以获得商和余数

后记

  • 养成良好习惯,指明段寄存器。由于系统会将方括号省略将地址认为是立即数,建议显性表示
  • 对内存单元操作要定长度
  • mov不能直接对两个内存空间操作,需要借助寄存器或栈

最后

以上就是满意小伙为你收集整理的学汇编,记笔记(七)_《汇编语言(第4版)》王爽著——数据处理的基本问题_寻址_div除法_伪指令dd和dup前言一、bx、bp和si、di二、表达一个数据的位置三、寻址方式四、伪指令dd五、指定数据长度六、dup批量声明数据七、div除法后记的全部内容,希望文章能够帮你解决学汇编,记笔记(七)_《汇编语言(第4版)》王爽著——数据处理的基本问题_寻址_div除法_伪指令dd和dup前言一、bx、bp和si、di二、表达一个数据的位置三、寻址方式四、伪指令dd五、指定数据长度六、dup批量声明数据七、div除法后记所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(35)

评论列表共有 0 条评论

立即
投稿
返回
顶部