汇编寻址与消除歧义 -- 汇编学习笔记(二)

来源:互联网 发布:重庆网络小额贷款牌照 编辑:程序博客网 时间:2024/05/06 04:21

学完了C语言来学汇编,有一个容易困惑的地方,那就是如何去访问一个变量,怎么对其进行修改,运算。

C语言中,我们有两种方式,取值和取值,可以直接 a+b,也可以用*a+*b

但在汇编中,更底层的认识让我们明白所谓的取值只是C语言的一个解释,想访问一个非立即数的元素,唯一的方法就是寻址,我们多种方式的目的就是为了找到我们需要变量的物理地址。

直接寻址:存储器

名字容易让人想到立即数,我们可以 MOV AL,[2CH]  

但是我们也可以 MOV AX,BUF

这个操作的意义就是把BUF的值传递给AX

C语言中。 Int a[10],  int *p = a;  只是拿到该地址,但在汇编中,只能到得到地址里的数据。 如果想得到 int *p ,MOV AX, OFFSET BUF 这样来实现

间接寻址:寄存器

间接的意思不直接读取存储器中的值而是从寄存器中间接得到,由BX中会有一种歧义,他可以存放一个地址数据,或者一个变量数据,所以我们要用[BX]来消除这种误会。

基址寻址基址 偏移量

这样可以直接定位一个一维数组里的变量,有两种书写形式

为了消除歧义,BX仍然必须放在[]

MOV DL,[BX+10]

MOV DL 10[BX] 

基址 变址区别:

基址一般是数组头或者字符串头,而变址就是后面的index

所以基址一般由OFFSET的来,而变址大多是自己的来的值

变址寻址 

和基址寻址的区别,可以有比例因子,因此可以更加灵活,如果访问WORD,用

2*SI + 偏移量就可以了。

如果在变址寻址中没有比例子因子的情况下,只能用SI,DI216位寄存器。

基址加变址寻址

利用[基址+变址*比例因子+偏移量]得到的值

 

消除歧义

严谨是汇编最大的特性,所以很多地方要提到如何去消除歧义。

比如BYTE PTR 就是一个很好的说明:

MOV中,ADD中等:

在操作中,如果目标是 间址或者基址,变址或者基址加变址来寻址的内存单元,而源是立即数,则必须用PTR来说明目标操作数的属性。


原创粉丝点击