更灵活的定位内存地址的方法
①:1.and指令:逻辑与指令,按位进程与运算。
mov al,01100011B
and al,00111011B
执行后:al=00100011B
通过该指令可将操作对象的相应位设为0,其他位不变。
2.or指令:逻辑或指令,按位进行或运算。
mov al,01100011B
or al,00111011B
执行后:
al = 01111011B
通过该指令可将操作对象的相应位设为1,其他位不变。
②:ASCII码的定义
db ‘ascii’
大小转换问题:
A的ASCII码是41H,a的ASCII码是61H。
sub al,20H 即可
或者将a中的ASCII码的第5位置为0,变为大写字母,和减32一个原理。
③:前面,我们用[bx]的方式来指明一个内存单元,还可以用一种灵活的方式来指明内存单元:[bx+idata]表示一个内存单元,它的偏移地址为(bx)+idata
mov ax,[bx+200]
偏移地址为bx中的数值加上200,段地址在ds中。
这种方式可以很方便的进行对数组的操作。
④:si和di是8086CPU中和bx功能相近的寄存器,si和di不能够分成两个8位寄存器来使用。
mov ax,[si+123]
mov ax,[di+123]
我们也可以用[bx+si]和[bx+di]来指明一个内存单元。
[bx+si]表示一个内存单元,它的偏移地址为(bx)+(si).
或者使用[bx+si+idata]和[bx+di+idata],偏移地址为bx中的数值加上si中的数值加上idata。
⑤:1.[idata]用一个常量来表示地址,可用于直接定位一个内存单元;
2.[bx]用一个变量来表示内存地址,可用于间接定位一个内存单元;
3.[bx+idata]用一个变量和常量表示地址,可在一个起始地址的基础上用变量间接定位一个内存单元;
4.[bx+si]用两个变量表示地址;
5.[bx+si+idata]用两个变量和一个常量表示地址。
一般来说,在需要暂存数据的时候,我们都应该使用栈。
数据处理的两个基本问题
①:bx、si、di和bp
1.在8086CPU中,只有这4个寄存器可以用在“[…]”中来进行内存单元的寻址。
mov ax,[bx]
mov ax,[bx+si]
而
mov ax,[ax]是错误的。
2.在[…]中,这4个寄存器可以单个出现,或只能以4种组合出现:bx和si、bx和di、bp和si、bp和di。
3.只要在[…]中使用寄存器bp,而指令中没有显式给出段地址,段地址默认在ss中。
②:寻址方法
③:指令处理的数据长度
1.通过寄存器名指明要处理的数据尺寸。
2.在没有寄存器名存在的情况下,用操作符 X ptr指明内存单元的长度,X在汇编指令中可以为word或byte。
inc word ptr ds:[0]
mov byte ptr ds:[0],1
④:div是除法指令,使用div做除法的时候应注意以下问题。
1.除数:有8位和16位两种,在一个reg或内存单元中。
2.被除数:默认放在AX或DX和AX中,如果除数为8位,被除数则为16位,默认在AX中存放;如果除数为16位,被除数则为32位,在DX和AX中存放,DX存放高16位,AX存放低16位。
3.结果:如果除数为8位,则AL存放除法操作的商,AH存放除法操作的余数;如果除数为16位,则AX存储除法操作的商,DX储存除法操作的余数。
⑤:db定义字节型数据,dw定义字型数据,dd定义double word型数据。
⑥:dup是一个操作符,在汇编语言中同db、dw、dd等一样,也是由编译器识别处理的符号。它是和db、dw、dd等数据定义伪指令配合使用的,用来进行数据的重复。
db 3 dup(0)
定义了3个字节,值为0.
db 3 dup(0,1,2)
相当于 db 0,1,2,0,1,2,0,1,2
db/dw/dd 重复的次数 dup(重复的数据)