主要内容:
1.总结一下bx,si,di,bp
2.机器处理的数据在什么地方
3.汇编语言中数据位置的表达
4.寻址方式
5.指令要处理的数据有多长
6.div指令
7.伪指令dd
8.dup
1.在8806CPU中,只有bx,si,di,bp能在[...]中来进行内存单元的寻址
但是mov ax,[bx+bp] mov ax,[si+di] 这两种组合是错的,其余任何组合方式都可以使用
2.绝大部分机器指令都是进行数据处理的指令,处理大致可分为三类:'读取','写入','运算',
在机器指令这一层来讲,并不关心数据的值是多少,而关心'指令执行的前一刻,将要处理的数据所在的位置',
所以要处理的数据可以在三个地方:'CPU内部','内存','端口'。此处先不讲端口的部分,先举例子描述前两类
<1>. mov ax,[o] 内存,DS:0单元,源对象是内存单元DS:0,目的对象是ax寄存器处
<2>. mov ax,bx CPU内部,AX寄存器,源对象是bx寄存器,目的对象是ax寄存器
<3>. mov ax,1 CPu内部,指令缓冲器,源对象是一个数据,目的对象是ax寄存器
3.汇编语言中用三个概念来表达数据的位置
<1>.立即数,就是直接进行操作的内存单元内的数据
例如:mov ax,1
add bx,2000h
or bx,00100000h
mov al,'a'
<2>.寄存器 指令要处理的数据存在寄存器中,,在汇编指令中给出相应的寄存器名
mov ax,bx
mov ds,ax
push bx
mov ds:[0],bx
总之,命令最后的是寄存器都属于这一类
<3>.段地址和偏移地址,就是源对象构成是[地址]的格式
mov ax,[0]
mov ax[di]
mov ax,[bx+6]
mov ax,[bx+si]
mov ax,[bp+si+6]
不限此处几种,命令最后的是具体的偏移地址的都是此类
4.寻址当时此处介绍五类
<1>.直接寻址
格式:[idata]
例如:mov ax,[o]
<2>.寄存器间接寻址
格式:[bx]
例如:mov ax,bx
<3>.寄存器相对寻址
格式:[bx+idata]
例如:mov ax,[bx+8]
<4>.基址变址寻址
格式:[si+bx]
例如:mov ax,[si+bx]
<5>.相对基址变址寻址
格式:[bx+si+idata]
例如:mov ax,[bx+si+8]
5.指令要处理的数据长度
<1>.通过寄存器指明要处理的数据的长度
例如: mov ax,1
mov bx,ds:[0]
mov ds,ax
例如: mov al,1
mov al,bx
mov al,ds:[0]
mov ds:[0],al
<2>.没有寄存器名存在的情况下,用操作符X ptr指明内存单元的长度,X通常可以用word和byte来表示
用word ptr进行操作的是一个字单元
mov word ptr ds:[0],1
inc word ptr [bx]
用type ptr进行操作的是一个字节单元
mov type ptr ds:[0],1
inc type ptr [bx]
6.div指令除法指令,
.1.除数,有八位和十六位两种,在一个reg或内存单元中
.2.被除数,默认放在AX或DX和AX中,如果除数是八位,被除数则为十六位,默认放在AX中
如果除数为16位,被除数则为32位,在DX和AX中存放,DX存放高16位,AX存放低16位
.3.如果除数为8位,则AL存储除法操作的商,AH存放除法操作的余数
如果除数为16位,则AX存储除法操作的商,DX存储除法操作的余数
举例表示:div byte ptr ds:[0] 相当于al=ax/(ds:[0])的商,ah=ax/(ds:[0])的余数
7.伪指令dd
dd和db,dw差不多,都是定义数据的指令,但是db定义字节型数据,dw定义字型数据。
而dd定义双型数据,类似复数
dd定义数据占2个字,db占1个字节,dw占两个字
好家伙,上几行代码复习一下上面知识点
data segment
dd 100001
dw 100
dw 0
data ends
分析
data段中的第一个数据是被除数,为dd型,32位,所以在做除法之前,用dx和ax存储,
应将data:0字单元中的低16位存储在ax中,data:2字单元中的高16位存储在dx中
mov ax,data
mov ds,ax
mov ax,ds:[0]
mov dx,ds:[2]
div word ptr ds:[4]
mov ds:[6],ax
8.dup 操作符,是用来配合db,dw,dd使用的,作用是重复数据输入
例如 db 200 dup (0) 相当于输入了200个0的数据
参考书籍《汇编语言第四版》王爽著,任课老师 胡海芝