1、处理的数据在什么地方
2、要处理的数据有多长
描述性符号:reg 和 sreg
reg:表示寄存器;sreg:表示段寄存器
reg:{ ax、bx、cx、dx、ah、al、bh、bl、ch、cl、dh、dl、sp、bp、si、di }
sreg:{ ds、ss、cs、es }
bp:基址指针寄存器
8086CPU 只有4个寄存器可以用在 [ ... ] 中来进行内存单元的寻址;
mov ax , [bx] mov ax , [bx+si] |
mov ax , [bx+di]
mob ax , [bp]
|
mov ax , [bp+si]
mov ax , [bp+di]
|
这些组合中,bx+bp si+di 组合是不允许的,其他可以随便组合还可以加上idata,如果[ ... ]中用到了bp,默认的段地址就是 ss 寄存器
mov ax , [bp] mov ax , [bp+idata] mov ax , [bp+si] mov ax , [bp+si+idata] |
( ax )=( ( ss )*16+( bp ) ) ( ax )=( ( ss )*16+( bp )+idata ) ( ax )=( ( ss )*16+( bp ) ) ( ax )=( ( ss )*16+( bp )+( si )+idata ) |
机器指令处理的数据所在位置寄存器
指令都是进行数据处理,大致可分为三类:读取、写入、运算;机器指令关心的是执行指令前数据所在的位置。
所要处理的数据可以在三个地方:CPU内部、内存、端口
汇编语言中数据位置的表达
1、立即数(idata):对于直接包含在机器指令中的数据(执行前在CPU指令缓冲器中)
eg:mov ax , 2000h
2、寄存器
3、段地址(SA)和偏移地址(EA)
寻址方式
当数据存放在内存中时,可以用多种方式给定这个内存单元的偏移地址,这种定位内存单元的方法一般称为寻址方式。
寻址方式 | 含义 | 名称 | 常用格式 |
[idata] | EA=idata ; SA=(ds) | 直接寻址 | [idata] |
[bx] [si] [di] [bp] |
EA=(bx);SA=(ds) EA=(si);SA=(ds) EA=(di);SA=(ds) EA=(bp);SA=(ss) |
寄存器间接寻址 | [bx] |
[bx+idata] [si+idata] [di+idata] [bp+idata] |
EA=(bx)+idata;SA=(ds) EA=(si)+idata;SA=(ds) EA=(di)+idata;SA=(ds) EA=(bp)+idata;SA=(ss) |
寄存器相对寻址 | 用于结构体: [bx].idata 用于数组: idata[si] , idata[di] 用于二维数组: [bx][idata]([bx+idata]) |
[bx+si] [bx+di] [bp+si] [bp+di] |
EA=(bx)+(si);SA=(ds) EA=(bx)+(di);SA=(ds) EA=(bp)+(si);SA=(ss) EA=(bp)+(di);SA=(ss) |
基址变址寻址 | 用于二维数组: [bx][si] |
[bx+si+idata] [bx+di+idata] [bp+si+idata] [bp+di+idata] |
EA=(bx)+(si)+idata;SA=(ds) EA=(bx)+(di)+idata;SA=(ds)
EA=(bp)+(si)+idata;SA=(ss)
EA=(bp)+(di)+idata;SA=(ss)
|
相对基址变址寻址 | 用于表格(结构)中的数组项: [bx].idata[si] 用于二维数组: idata[bx][si] |
指令要操作的数据长度
1、指令可以处理两种长度的数据,byte 和 word (eg:al、ax)
2、没有寄存器的情况下可以用操作符 X ptr 指明内存单元的长度,X 在汇编指令中可以为 word 或 byte。
; word ptr 指明指令访问的内存单元是一个 字单元 mov word ptr ds:[0] , 1 inc word ptr [bx] inc word ptr ds:[0] add word ptr [2] , 2 |
; byte ptr 指明指令访问的内存单元是一个 字节单元 mov byte ptr ds:[0] , 1 inc byte ptr [bx] inc byte ptr ds:[0] add byte ptr [bx] , 2 |
3、有些指令只能进行字操作 (eg:push、pop)
div 指令
1、除数:有8位和16位两种,存放在一个寄存器或内存单元中。
2、被除数:默认存放在 AX 或 DX 和 AX 中,如果除数为8位,被除数则为16位,默认在 AX 中存放;如果除数为16位,被除数则为32位,在 DX 和 AX 中存放,DX 存放高16位,AX 存放低16位。
3、结果:如果除数为8位,则 AL 存储除法操作的商,AH 存储除法操作的余数;如果除数为16位,则 AX 存储除法操作的商,DX 存储除法操作的余数。
|
; 利用除法指令计算100001/100 ; 因为100001大于65535,只能用 dx 和 ax 两个寄存器存放。除数100可以用一个8位寄存器,但是被除数32位,所以只能用16位寄存器 ; 100001十六进制表示是:186A1H mov dx , 1h ; dx存放高16位 mov ax , 86A1h ; ax存放低16位 mov bx , 100 div bx ;最终结果保存在AX和DX中 //AX 存放商,DX存放余数,最后结果:1000 ... 1 |
; 利用除法指令计算1001/100 ;被除数1001可以用ax寄存器来存放,100可以用8位寄存器存放 mov ax , 1001 mov bl , 100 div bl ; 结果存放在ax中 //结果为:0A ... 01( 10...1 ) |
伪指令 dd
dd:dword(double world , 双字)型数据。
data segment db 1 ; 01H 数据在data:0处,占一个字节 dw 1 ;0001H 数据在data:1处,占一个字 dd 1 ;00000001H,数据在data:3处,占两个字 data ends |
dup
操作符,在汇编语言中和 db、dw、dd 等一样,是由编译器识别处理的符号。它是和 db、dw、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个字节,db 'abcABCabcABCabcABC' |