reg/sreg
reg:寄存器
reg的集合包括:ax,bx,cx,dx,ah,al,bh,bl,ch,cl,dh,dl,sp,bp,si,di
sreg:段寄存器
sreg的集合包括:ds,ss,cs,es
bx,si,di,bp
- 在8086CPU中,只有这4个寄存器(bx,bp,si,di)可以用在
[…]
中来进行内存单元的寻址- 正确的指令形式:
mov ax,[bx]
mov ax,[bx+si]
- 错误的指令形式:
mov ax,[cx]
mov ax,[ax]
- 正确的指令形式:
- 在
[…]
中这4个寄存器可以单个出现,或只能以四种组合出现:bx和si、bx和di、bp和si、bp和di- 错误的用法:
mov ax,[bx+bp]
mov ax,[si+di]
- 错误的用法:
- 只要在
[…]
中使用寄存器bp,而指令中没有显性的给出段地址,段地址就默认在ss中
数据的位置
汇编语言用三个概念来表示数据的位置
- 立即数(idata)
- 对于直接包含在机器指令中的数据(执行前在CPU的指令缓冲器中),例如
mov ax.1
中的1即为立即数
- 对于直接包含在机器指令中的数据(执行前在CPU的指令缓冲器中),例如
- 寄存器
- 段地址(SA)和偏移地址(EA)
- 存放段地址的寄存器可以是默认的
- 默认在ds中的场景
- mov ax,[0]
- mov ax,[bx]
- mov ax,[bx+8]
- mov ax,[bx+si]
- mov ax,[bx+si+8]
- 默认在ss中的场景
- mov ax,[bp]
- mov ax,[bp+8]
- mov ax,[bp+si]
- mov ax,[bp+si+8]
- 默认在ds中的场景
- 存放段地址的寄存器也可以显性的给出
- mov ax,ds:[bp]
- mov ax,es:[bx]
- mov ax,ss:[bx+si]
- mov ax,cs:[bx+si+8]
- 存放段地址的寄存器可以是默认的
数据的长度
8086CPU的指令可以处理两种尺寸的数据,字节(byte)和字(word),所以在机器指令中要指明,指令进行的是字操作还是字节操作,在32位处理器中还引入了双字(double word),在64位处理器还引入了四字
- 通过寄存器名指明要处理的数据的尺寸
- 指明了是字(word)操作
- mov ax,1
- mov bx,ds:[0]
- mov ds,ax
- mov ds:[0],ax
- inc ax
- add ax,1000
- 指明了是字节(byte)操作
- mov al,1
- mov al,bl
- mov al,ds:[0]
- mov ds:[0],al
- inc al
- add al,100
- 指明了是字(word)操作
- 在没有寄存器名存在的情况下,用操作符X ptr指明内存单元的长度,X在8086汇编指令中可以为word或byte
- 用word ptr指明访问字(word)单元
- mov word ptr ds:[0],1
- inc word ptr [bx]
- inc word ptr ds:[0]
- add word ptr [bx],2
- 用byte ptr指明访问字节(byte)单元
- 用word ptr指明访问字(word)单元
- 其他方法
- 有些指令默认了访问的是字节(byte)或字(word)
- push指令只进行字(word)操作:
push [1000H]
- push指令只进行字(word)操作:
- 有些指令默认了访问的是字节(byte)或字(word)
结构化访问数据
一般来说我们可以用[bx+idata+si]的方式来进行访问结构体中的数据
- 用bx定位整个结构体
- 用idata定位结构体中的某一个数据项
- 用si定位数组项中的每个元素
所以也可以使用更方便的写法,例如:[bx].idata
[bx].idata[si]
div
div是除法指令(division),使用div作除法的时候
- 除数:8位或16位,在寄存器或内存单元中
- 被除数:(默认)放在AX或DX和AX中
除数 | 被除数 |
---|---|
8位 | 16位(AX) |
16位 | 32位(DX+AX) |
运算 | 8位 | 16位 |
---|---|---|
商 | AL | AX |
余数 | AH | DX |
div指令格式:
- div reg
- div 内存单元
- div byte ptr ds:[0]
- div word ptr es:[0]
db、dw、dd
db
db在汇编中表示一个byte,就是一个字节8位,每次读取数据时,读完一个偏移量加1
dw
dw在汇编中表示一个字(word),就是两个字节16位,每次读取数据时,读完一个偏移量加2
dd
dd在汇编中表示一个双字,就是四个字节32位,每次读取数据时,读完一个偏移量加4
dup
dup和db、dw、dd等数据定义伪指令配合使用的,来进行数据的重复
- db 重复的次数 dup (重复的字节型数据)
- dw 重复的次数 dup (重复的字型数据)
- dd 重复的次数 dup (重复的双字型数据)
示例
- db 3 dup(0)
- 定义了3个字节,他们的值都是0,相当于db 0,0,0
- db 3 dup(0,1,2)
- 定义了9个字节,他们的值是(0,1,2,0,1,2,0,1,2),相当于db 0,1,2,0,1,2,0,1,2
- db 3 dup(‘abc’,‘ABC’)
- 定义了18个字节,他们的值是(‘abcABCabcABCabcABC’),相当于db ‘abcABCabcABCabcABC’