直接寻址与立即寻址的区别
各位大佬,最近在学PE里面的重定位,查资料说是只要是直接寻址,就是使用了重定位,但是我看了图片里面标注的两行汇编代码,好像是立即寻址啊,有点搞不清楚了,想询问下大老哈,直接寻址和立即寻址在汇编里面到底应该怎么写哈?格式是什么样的呢? 本帖最后由 zmbilx 于 2019-9-11 14:19 编辑
bester 发表于 2019-9-10 16:16
直接寻址 call 00401000 push 00401000等
间接寻址 call dword ptr 如果00401000保存的是12 ...
看下这个,这个是我从网上找的,不知道这个讲的对不对哈,我是按这个学的
立即寻址就是指令当中自带数据,直接读取,最快;
直接寻址就是指令中存放的是地址,直接解析这个地址;
间接寻址就只指令中存放的是地址的地址,或者是存放地址的寄存器,最慢。
1、立即寻址方式:
操作数就包含在指令中。
作为指令的一部分,跟在操作码后存放在代码段。
这种操作数成为立即数。立即数可以是8位的,也可以是16位的。
例如:
指令: MOV AX,1234H
则: AX = 1234H
2、直接寻址方式:
操作数在寄存器中,指令直接包含有操作数的有效地址(偏移地址)
注:操作数一般存放在数据段所以操作数的地址由DS加上指令中直接给出的16位偏移得到。
如果采用段超越前缀,则操作数也可含在数据段外的其他段中。
例如:
MOV AX,
如(DS) = 2000H,
则执行结果为(AX) = 3050H(物理地址=20000+8054=28054H)
28054H里的内容为3050H
在汇编语言指令中,
可以用符号地址代替数值地址如:MOV AX,VALUE此时VALUE为存放操作数单元的符号地址。
如写成:MOV AX,也是可以的,两者是等效的。
如VALUE在附加段中,则应指定段超越前缀如下:MOV AX,ES:VALUE 或 MOV AX,ES:
3.间接寻址方式:
操作数在寄存器中,操作数有效地址在SI、DI、BX、BP这四个寄存器之一中。
在一般情况下,如果有效地址在SI、DI和BX中,则以DS段寄存器中的内容为段值。
如果有效地址在BP中,则以SS段寄存器中的内容为段值
例如:MOV AX,如果(DS) = 5000H (SI) = 1234H
则物理地址 =50000 + 1234 = 51234H51234H
地址中的内容为:6789H
执行该指令后,(AX) = 6789H
出自:https://blog.csdn.net/skyxmstar/article/details/70039520 没听说过立即寻址 就听说过 直接 和间接 直接寻址 call 00401000 push 00401000等
间接寻址 call dword ptr 如果00401000保存的是12345678 那么相当于call 12345678
不过恕我直言 立即寻址难道不等于直接寻址吗?
页:
[1]