|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
引导语
关于处理数据的两个基本问题:
(1)处理的数据在什么地方?
(2)要处理的数据有多长?
声明:reg:表示寄存器
sreg:表示段寄存器
8.1节 bx、si、di和bp
在8086中只有这四种寄存器可以用在[......]中表示内存单元的寻址。
其实对于新的bp,它就是另一个bx,只不过它的段地址在ss中
下面的指令都是正确的:
mov [bp]
mov [bp + si]
mov [bp + di]
mov [bp + si + idata]
但一下的指令是错误的;
mov ax, [bx + bp]
mov ax, [si + di]
8.5节 指令要处理的数据有多长
8086CPU能出来byte和word尺寸的数据,那么怎么知道它们的长度呢?
方法一、通过寄存器名指明要处理的数据的尺寸
如: mov ax, 1
mov bx, ds:[0]
处理字型数据
如: mov al, 1
mov bl, ds: [0]
处理字节型数据
方法二、用操作符 X ptr 指明内存单元的长度,X在汇编语言中可以为word或byte。
如: mov word ptr ds:[0], 1
add word ptr [bx], 2
处理字型数据
如: mov byte ptr ds:[0], 1
add byte ptr [bx], 2
出来字节型数据
方法三、其他方法
比如push [1000H] 就不用指明访问的是字节型单元还是字单元,因为push指令只进行字操作
8.6寻址方式的综合应用
问题:将下面data段中数据的排名和产品修改为137, ‘VAX’。将收入增加70
代码:
- assume cs: code
- data segment
- db'DEC'
- db 'Ken Islen'
- dw 137, 40 ;排名,收入
- db 'PDP' ;产品
-
- data ends
- code segment
- start : mov ax, data
- mov ds, ax
- mov si, 0
-
- mov bx, 0
-
- mov word ptr 0cH[bx], 38
- add word ptr 0eH[bx], 70
-
- mov byte ptr 10H[bx][si], 'V'
- inc si
- mov byte ptr 10H[bx][si], 'A'
- inc si
- mov byte ptr 10H[bx][si], 'X'
-
- mov ax, 4c00H
- int 21H
-
- code ends
- end start
复制代码
只要熟练掌握内存的寻址方式即可,用bx定位整体的位置,即结构体的偏移地址,用idata定位数据项,用si定位数组的每个元素,大致及就是[bx]. idata[si],跟C语言中的结构体差不多,,如结构体名struct.pd,其中struct相当于bx,pd相当于idata,i相当于si。
8.7节 div指令
div是除法指令,这里说明下:a/b,a是被除数,b是除数。
div看除数是几位数而决定用不同的被除数位置
(1)除数是8bit的,被除数就用16位,被除数放在ax中,得到的商放在al,得到的余数放在ah中
如:1001/100 代码:
- assume cs: code
- code segment
- start : mov ax, 1001
- mov bl, 100
- div bl
-
- mov ax, 4c00H
- int 21H
-
- code ends
- end start
复制代码
在al中为0AH(即10),ah中为1(余数为1)
(2)除数是16bit的,被除数就用32位的,被除数的高16位放在dx中,低16位放在ax中,得到的商放在ax中,得到的余数放在dx中
如:100001 / 100,因为被除数>65536所以不能只用ax存放,代码如下:
- assume cs: code
- code segment
- start : mov dx, 1
- mov ax, 86A1H
- mov bx, 100
- div bx
-
- mov ax, 1001
- mov bl, 100
- div bl
- mov ax, 4c00H
- int 21H
-
- code ends
- end start
复制代码
ax中得到商03e8H(即1000), dx中为1(余数为1)
8.8节 dd
和定义数据的db和dw一样,dd是定义两个字型数据(double word)的,它占四个字节
问题:将下面的data段中的第一个数据除以第二个数据后的结果放在第三个数据的存储单元中,代码:
- assume cs: code
- data segment
- dd 100001
- dw 100
- db 0
-
- data ends
- code segment
- start : mov ax, data
- mov ds, ax
-
- mov ax, ds:[0]
- mov dx, ds:[2]
- div word ptr ds:[4]
- mov ds:[6], ax
-
- mov 4c00H
- int 21H
-
- code ends
- end start
复制代码
8.9节 dup
dup指令是定义多个数据
如db 200 dup (0)的意思是定义200个0,和db、dw和dd配合使用
第八章总结
(1)本章多出许多操作符,如dup、dd、div和bp。
(2)dup的功能是定义多个数据、dd的意思是定义4个字节长的数据
(3)div是除法指令看除数的多少位决定用哪里的被除数,bp是和bx差不多功能的寄存器,只不过bp的段地址在ss中
(3)本章最重要的是讲解两个基本问题的解决,一个是找到数据的位置、另一个怎么知道数据的大小
(4)用bx、si、di、bp的[......]表示内存寻址方式找到数据的位置,用寄存器、X ptr和其他形式知道数据的大小 |
|