读王爽老师汇编语言笔记---定位内存地址和数据处理

来源:互联网 发布:卖假货的淘宝足球鞋店 编辑:程序博客网 时间:2024/05/19 15:24
2013-7-4 21:31:05


and 和 or 指令
and:逻辑与指令,按位进行与计算
作用:通过该指令,可将操作对象的相应位设设为0,其他为不变


or :逻辑或指令,按位进行或计算
作用:通过该指令,可将操作对象的相应位设置为1,其他为不变


[bx+idata]
前面用[bx]方式来指明一个内存单元,现在可以用更加灵活的方式来指明内存单元,
[bx+idata]表示一个内存单元,它的偏移地址为(bx)+idata(bx中的数值加上idata)
如:mov ax, [bx+200]
将一个内存单元的内容送入ax,这个内存单元的长度,为2字节,存放一个字,
偏移地址为bx中的数值加上200, 段地址为ds中
常见写法:
mov ax, [200+bx];
mov ax, 200[bx];
mov ax, [bx].200;
通过[bx+idata]这种表达内存单元的方式,我们可以通过更高级的结构来看待所要处理的数据。


SI和DI
SI、DI是8086cpu中和bx功能相近的寄存器,si和di不够分成两个8位寄存器来使用。
在前面我们用[bx+idata]的方式来指明一个内存单元,介绍了si和di我们就有了更加灵活的表示方式
[bx+si]和[bx+di], 两者的表达含义类似
即表示一个内存单元,它的偏移地址为(bx)+(si)(bx中的数值加上si中的数值)
同理[bx+si+idata]和[bx+di+idata]含义也类似
表示一个内存单元,它的偏移地址为(bx)+(si)+idata(bx中的数值加上si中的数值加上idata)
通过这几种定位内存地址的方法(也就是所谓的寻址方式),可分为以下几种:
1、[idata]用一个常量表示地址,可用于直接定位一个内存单元
2、[bx]   用一个变量表示内存地址,可用于间接定位一个内存单元,
3、[bx+idata] 用一个变量和一个常量表示内存地址,可在一个起始地址的基础上用变量间接定位一个


内存单元
4、[bx+si]用两个变量来表示地址
5、[bx+si+idata]用两个变量加一个常量来表示地址
可以看出,从[idata]到[bx+si+idata],我们可以用更加灵活的方式来定位一个内存单元的地址。这样也


就更加结构化的角度来看待所要处理的数据。


我们使用内存来暂存数据,这一点是可以确定的,但是值得推敲的是,我们用怎样的结构来保存这些数


据,从而使得我们的程序更加清晰,一般来说,在需要暂存数据的时候,都应该使用栈,通过栈的特殊


操作,如pop,push等来进行特殊的操作。


bx si di bp
在8086cpu中,只有上述的四种寄存器可以在[…]来进行内存单元的寻址。
当然可以以某些组合的形式存放在[...]中
但是[bx+bp] [si+di]指令是错误的。
值得注意的是:只要在[...]中使用寄存器bp,而指令中没有显示的给出段地址,那么段地址就默认在ss


中,如:
mov ax,[bp]  含义:(ax) = ((ss)*16 + (bp));


机器指令处理的数据所在位置
绝大部分机器指令都是在进行数据处理的指令,处理大致可分为三类:读取、写入、运算。
在机器指令这一层来讲,并不关心数据的值是多少,而是关心指令执行前一刻,它将要处理的数据所在


的位置,指令在执行前,所要处理的数据可以在三个地方:cpu内部,内存,端口。
汇编语言中数据位置的表达
汇编语言中,用三个概念来表达数据的位置,
1、立即数(idata)
对于直接包含在机器指令中的数据(执行前在cpu的指令缓冲器中),在汇编语言中称为立即数,
在汇编指令中直接给出
2寄存器
指令要处理的数据在寄存器中,在汇编指令中给出相应的寄存器中。
3段地址(SA)和偏移地址(EA)
指令要处理的数据在内存中,在汇编指令中可用[x]给出EA,SA在某个寄存器中。且存放段地址的寄存器


可以是默认的。


寻址方式
当数据存放在内存中的时候,我们可以用多种方式来给定这个内存单元的偏移地址,这种定义内存单元


的方法一般称为寻址地址,
8086cpu有多种寻址方式;
直接寻址[idata]、
寄存器间接寻址[bx] [si] [di] [bp]、
寄存器相对寻址[bx+idata]、
基址变址寻址[bx+si]、
相对基址变址寻址[bx+si+idata]


指令要处理的数据长度
8086cpu的指令,可以处理两个尺寸的数据,byte和word,所以在机器指令中要指明,指令进行是字操作


还是字节操作,所以汇编通常通过以下处理方式
1.通过寄存器指明要处理的数据的尺寸
2.在没有寄存器名存在的情况下,用操作符 X ptr指明内存单元的长度,X在汇编指令中可以为word或者


byte。
3.其他方法。有些默认了访问的是字单元还是字节单元。




div指令
div除法指令, 使用div指令时:
1、除数  :有8位和16位两种,在一个寄存器或内存单元中。
2、被除数:默认放在AX或者DX和AX中,如果除数是8位,被除数则为16位默认在AX中
           如果除数是16位,被除数32位,在DX和AX中存放,DX存放高16位,AX存放低16位
3、结果 :如果除数是8位的,则AL存放除法操作的商,AH存放除法操作的余数,
           如果除数是16位的,则DX存放除法操作的商,AX存放除法操作的余数




伪指令dd
前面提到用db和dw定义字节型数据和字型数据。dd是用来定义双字节型数据(double word)
data segment
db 1
dw 1
dd 1
data ends
在data段中定义了三个数据
第一个数据位01H,在data:0处 ,占一个字节
第二个数据位0001H,在data:1处,占1个字,
第三个数据位00000001H,在data:3处,占2个字


dup
dup是一个操作符,在汇编语言中同db,dw dd等一样,也是由编译器识别处理的符号,它是和db,dw,


dd等数据定义伪指令配合使用的,用来进行数据重复。如:
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个字节, 以此类推

dup就是用来进行数据重复。


原创粉丝点击