目录
一、bx、si、di和bp
二、机器指令处理的数据在什么地方
三、汇编语言中数据位置的表达
四、寻址方式
五、指令要处理的数据有多长
六、汇编中和C语言中结构体类似的寻址方式
七、div指令
八、伪指令dd
九、dup
定义的描述性符号:reg和sreg
reg表示一个寄存器,包括:
ax,ah,al,bx,bh,bl,cx,ch,cl,dx,dh,dl,sp,bp,sp,di
sreg表示一个段寄存器,包括:
ds,ss,cs,es
(1)只有这4个寄存器可以在[……]中来进行内存单元的寻址
(2)在[……]中,这4个寄存器可以单独出现,或只能以4种组合出现:
bx和si bx和di bp和si bp和di
(3)只要在[……]中使用bp,而指令中没有显性地给出段地址,段地址就默认在ss中
3个地方:CPU内部、内存、端口
例:
mov bx,[0] 内存,ds:0单元
mov bx,ax CPU内部,ax寄存器
mov bx,1 CPU内部,指令缓冲器
(1)立即数(idata):直接包含在机器指令中的数据
例:mov ax,1
mov al,'a'
(2)寄存器
例:mov ax,bx
(3)段地址(SA)和偏移地址(EA)
用[X]的格式给出EA,SA在某个段寄存器中
1 存放段地址的寄存器可以是默认的
如:mov ax,[bx] 段地址默认在ds中
mov ax,[bp] 段地址默认在ss中
2 寄存器也可以是显性给出的
如: mov ax,ds:[bp]
(1)直接寻址
[idata]
(2)寄存器间接寻址
[bx] [si] [di] [bp]
(3)寄存器相对寻址
[bx+idata] [si+idata] [di+idata] [bp+idata]
(4)基址变址寻址
[bx+si] [bx+di] [bp+si] [bp+di]
(5)相对基址变址寻址
[bx+si+idata] [bx+di+idata] [bp+si+idata] [bp+di+idata]
(1)通过寄存器名指明
字操作:mov ax,1 mov,ds:[0],ax inc ax
字节操作:mov al,1 mov ds:[0],al inc al
(2)X ptr (X为word或byte)
字单元:mov word ptr ds:[0],1
字节单元 mov byte ptr ds:[0],1
(3)其他
有些指令默认了访问的是字单元还是字节单元,如push指令只进行字操作
C语言中:
若有结构体company,成员有name[3]
则可以用company.name[1]访问名称的第二个字符
汇编语言中:
可以用[bx+idata+si]的方式访问数据
其中,用bx定位整个结构体,idata定位结构体中的某一个数据项,用si定位数据项中的每个元素。
书写方式:[bx].idata [bx].idata[si]
(1)除数:有8位和16位两种,在一个reg或内存单元中。
(2)被除数:
若除数为8位,被除数为16位,默认在AX中存放
若除数位16位,被除数则为32位,在DX和AX中存放,DX存放高16位,AX存放低16位
(3)结果:
若除数为8位,则AL存储商,AH存储余数
若除数为16位,则AX存储商,DX存储余数
例1:div byte ptr ds:[0]
含义:(al)=(ax)/((ds)*16+0)的商
(ah)=(ax)/((ds)*16+0)的余数
例2:div word ptr es:0
含义:(ax)=((dx)*10000H+(ax))/((es)*16+0)的商
(dx)=((dx)*10000H+(ax))/((es)*16+0)的余数
例3:计算100001/100
100001大于65535,不能用ax存放,所以只能用ax和dx存放。
100001的16进制表示为186A1H
故指令为:
mov dx,1
mov ax,86A1H
mov bx,100
div bx
前面学过了db和dw
db定义字节型数据,dw定义字形数据
这里dd定义双字型数据(double word),占2个字,4个字节,8个bit位
dup是一个操作符,和db,dw,dd等数据定义伪指令配合使用
语法:db 重复的次数 dup (重复的字节型数据)
dw 重复的次数 dup (重复的字型数据)
dd 重复的次数 dup (重复的双字型数据)
例:定义一个容量为200个字节的栈段
db 200 dup (0)