汇编语言(王爽)学习记录_第八章
第八章 数据处理的两个基本问题
定义描述性符号:reg集合表示:ax,bx,cx,dx,ah,al,bh,bl,ch,cl,dh,dl,sp,bp,si,di sreg集合表示:ds,ss,cs,es
bx、si、di和bp
(1)8086CPU中只有这四个可用在“[ ]”:mov ax,[bx] 、 mov ax,[bx+di] 、mov ax,[bx+si] 、mov ax,[bp] 、mov ax,[bp+si] 、mov ax,[bx+di]
错误用法:mov ax,[cx] 、 mov ax,[ax] 、mov ax,[dx] 、 mov ax,[ds]
(2)在“[ ]”中这四个可以单独出现也可以以这4中种组合:bx和si,bx和di,bp和si,bp和di
例: mov ax,[bx]
mov ax,[di]
mov ax,[si]
mov ax,[bp]
mov ax,[bx+si]
mov ax,[bx+di]
mov ax,[bp+si]
mov ax,[bp+di]
mov ax,[bx+si+idata]
mov ax,[bx+di+idata]
mov ax,[bp+si+idata]
mov ax,[bp+di+bp]
(3)在”[ ] “中使用bp,而没有显性给出段地址则段地址默认在ss中
例: mov ax,[bp]
mov ax,[bp+idata]
mov ax,[bp+si]
mov ax,[bp+si+idata]
汇编语言中数据位置的表达
(1)立即数(idata) 直接在机器指令中的数据(执行前在CPU的指令缓存中)称为立即数,例如:mov ax,1、add bx,2000h、or bx,00020000b、mov al,'a'
(2)寄存器 数据在寄存器中,例:mov ax,bx、mov ds,ax、push bx
(3)段地址(SA)和偏移地址(EA) 要处理的数据在内存中用[EA]格式给出EA,SA在某个段寄存器中。例:mov ax,[0](特殊可以这样写)、mov ax,[di]、mov ax,[bx+8](前三段寄存器都在ds中)、mov ax,[bp](段寄存器在ss中)、也可以显性给出:mov ax,ds:[bp]、mov ax,es:[bx]
寻址方式
指令要处理的数据有多长
8086CPU种机器指令要指明数据处理的是字还是字节有以下3种方式:
(1)通过寄存器指明:mov ax,1、mov bx,ds:[0]、mov al,1、 mov al,bl前两者是对字型数据操作,后两者是对字节型数据操作。
(2)用操作符X ptr指明内存单元的长度X可以是word、byte例如:mov word ptr ds:[0],1、mov word ptr [bx]、add byte ptr [bx],2、inc byte ptr ds:[0]
(3)其他例如出入栈,push [1000H]不能指明访问单元类型,只能对字操作。
div指令
div指令做除法时要看除数的位数:
除数 | 8位 | 16位 |
被除数 | 默认AX中 | DX(高16位)和AX(低16位)中 |
商 | AL | AX |
余数 | AH | DX |
格式:
div reg
div 内存单元
例:
div byte ptr ds:[0] 表示(al)=(ax)/((ds)*16+0)的商、(ah)=(ax)/((ds)*16+0)的余数
div word ptr es:[0] 表示(ax)=[(dx)*10000H+(ax)]/((es)*16+0)的商、(dx)=[(dx)*10000H+(ax)]/((es)*16+0)的商
编程:100001/100
mov dx,1
mov ax,86a1h
mov bx,100
div bx
伪指令dd
与dw和db一样定义数据,dd定义的是32位数据。
data sagement
db 1
dw 1
dd 1
data ends
第一个数据01H,在data:0处占1个字节
第二个数据0001H,在data:1处占一个字
第三个数据00000001H,在data,3处占两个字
dup
与dd,dw,db一起使用,用于进行数据的重复。
例如:db 3 dup(0) 相当于db 0,0,0
db 3 dup(0,1,2) 相当于db 0,1,2,0,1,2,0,1,2