NASM中使用VAR作为memptr内存块指针的两类技术问题
NASM 相关问题解答
问题1:将 memptr + 1023 的地址加载到 VAR 中
首先要注意:你定义的 VAR DW 0000 是16位字类型,如果是在32位或64位汇编环境下,内存地址是32位/64位,16位的VAR存不下完整地址,建议先把VAR改成32位双字类型:VAR DD 00000000。
具体实现指令
- 32位模式下:
mov eax, memptr + 1023 ; 汇编器会直接计算出 memptr+1023 的常量地址值,存入EAX mov dword [VAR], eax ; 将EAX中的地址写入VAR变量 - 16位模式下(地址本身为16位):
mov ax, memptr + 1023 mov var, ax
问题2:MOV [VAR], EAX 的作用
这条指令是直接将EAX的内容存入VAR变量本身的内存地址,而非VAR指向的内存地址。
如果要把EAX的内容存入VAR指向的地址,需要先把VAR里的地址加载到寄存器,再间接访问:
mov ebx, dword [VAR] ; 把VAR中存储的地址加载到EBX mov [ebx], eax ; 将EAX内容写入EBX指向的内存地址
另外要注意:你定义的VAR是16位DW,而EAX是32位寄存器,直接执行MOV [VAR], EAX会因操作数大小不匹配报错,这也是建议把VAR改成DD(32位)的原因之一。
内容的提问来源于stack exchange,提问作者FJRusso
相关产品推荐
相关产品推荐

