寄存器,间接,基本+位移,双重间接和PC相对有什么区别。鉴于它们在某些情况下的使用,我不太清楚我是否理解如何区分这些不同的寻址模式。有人可以帮我认识一下他们之间的区别吗?
答案 0 :(得分:1)
从语法上讲,在汇编代码级别,寻址模式由多个因素决定......
MOV DWORD PTR ...
MOV
具有将其第二个参数引用的数据复制到其第一个参数引用的位置的效果。关于这些参考文献的性质,有许多可能的组合:
MOV <reg>, <reg> ; register to register
MOV <reg>, <mem> ; memory to register
MOV <mem>, <reg> ; register to memory
MOV <reg>, <const> ; immediate value to register
MOV <mem>, <const> ; immediate value to memory
此外,当相应的操作数在括号中时,这些引用可能是间接的。例如,MOV WORD PTR [ebx], 99
将表示为16位整数的值99移动到EBX寄存器指向的存储器位置。
此外,括号中的间接内存位置可以表示为简单算术表达式,例如MOV [esi+eax], dl
。这里寄存器DL中的字节被复制到通过添加ESI和EAX寄存器的内容找到的存储器位置。请注意,这不仅仅是两个寄存器,它也可以是[esi + 8*ebx]
或[esi - 16]
等表达式。
考虑到所有这些,这里有一些MOV操作的例子:
MOV eax, [edx] ; Copies 4 bytes in memory at the address contained in EDX
; into EAX the size (4bytes) is implied by the size of EAX.
MOV [MyVar], ebx ; Copies the contents of EBX into the 4 bytes at memory address
; MyVar. (Assumes MyVar is a 32-bit constant).
MOV eax, [esi-4] ; Copies 4 bytes at memory address ESI -4 into EAX
MOV [esi+eax], bl ; Copies the contents of BL (one byte) into the byte at address
; ESI+EAX
MOV BYTE PTR [MyVar], 123 ; Copies the (decimal) value 123 coded as an 8 bits
; to the memory address contained by MyVar.
; Here the size directive (BYTE PTR) is necessary.