正在加载……
专注、离线、切勿分心
1、处理的数据在什么地方
2、要处理的数据有多长
描述性符号:regsreg
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'





posted on 2017-09-18 23:57  正在加载……  阅读(438)  评论(0编辑  收藏  举报