《汇编语言》– 内存地址定位和数据处理

更灵活的定位内存地址的方法

 

①: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中。

 

②:寻址方法

image

 

③:指令处理的数据长度

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(重复的数据)

本文链接:http://www.alonemonkey.com/masm-chapter78.html