处理数据时有两个基本问题:
- 处理的数据存储在什么地方?
- 处理的数据有多长?字节、字还是双字?
寄存器bx、bp、di、si,只有这四个寄存器可以用于寄存器间接寻址,它们之间可以特定组合。
用不太标准的语言来说,bx和bp是同一等级,di和si是同一等级且比bx、bp低一级,bx和bp不能同时使用,di和si不能同时使用,那么就分别有四种组合。
汇编语言中数据位置的表达:
- 立即数;数字或者字符。1,2000h,'a'
- 寄存器;四个通用寄存器都可以单独表示地址,ax、bx、cx、dx
- 段地址(SA)+偏移地址(EA);段地址都是默认的,ds、es等。偏移地址的表示有多种方法。
- 只用立即数,为直接寻址
- 只用寄存器bx、bp、di、si中的一个,为寄存器间接寻址
- 只用寄存器bx、bp、di、si中的一个再加上一个立即数,为寄存器相对寻址 也可写成[bx].idata,[bx+idata]
- 用寄存器bx、bp、di、si中的两个,比如[bx+si]、[bx+di]、[bp+si]、[bp+di],为基址变址寻址
- 用寄存器bx、bp、di、si中的两个再加上一个立即数,比如[bx+si+idata]、[bx+di+idata]、[bp+si+idata]、[bp+di+idata],为相对基址变址寻址
数据长度的表达:
- 操作寄存器时,默认为寄存器长度。mov ax,1 mov al,1分别为字操作和字节操作
- 用操作符X ptr指明,其中X为 word 或 byte。例如mov word ptr ds:[0],1指明了是字操作
- push和pop指令,默认只进行字操作。
div指令:
div是除法指令,先普及一下a/b=c……d,其中a是被除数,b是除数,c是商,d是余数
- 除数,存储在内存单元或者是寄存器中,可以是8位或者16位
- 被除数,默认放在AX或者DX中。除数是8位时,被除数位16位,在ax中;除数是16位时,被除数为32位,高16位在dx中,低16位在ax中
- 商和余数,除数为8位时,商存放在AL,余数存放在AH;除数为16位时,商存放在AX,余数存放在DX
- 格式为 div reg 或 div 内存单元,可以指明长度。div byte ptr ds:[0]
特殊情况时,如果除数为8位,被除数理应为16位,但16位可能无法存放某些较大的被除数,这时只能用AX和DX。
例如100001/100,100为8位数,理应用ax存放100001,但是100001>65535,所以100001的高位存储在DX,低位存储在AX (dx)*10000H+(ax) = 100001
伪指令dd:
db为 define byte定义字节型数据,dw为 define word定义字型数据,dd为 define double word定义双字型数据
操作符dup:
配合db、dw、dd等数据定义伪指令使用的,用于进行数据的重复。格式如下
数据定义指令 重复次数 dup指令 (重复的内容)重复的内容中的单个数据长度 默认是与数据定义指令的类型相同 db 3 dup (0) 定义了3个字节,内容都是0 (3默认是字节型,如果改成dw,3默认是字型)
db 3 dup (0,1,2) 定义了九个字节,为0、1、2、0、1、2、0、1、2