汇编-MOV指令
32位mov
MOV指令将数据从源操作数复制到目的操作数。
在它的基本格式中,第一个操作数是目的操作数,第二个操作数是源操作数:
MOV destination, source
其中,目的操作数的内容会改变,而源操作数不会改变
在几乎所有的汇编语言指令中,左边的操作数是目的操作数,而右边的操作数是源操作数。
只要遵守如下原则, MOV指令在使用操作数方面是非常灵活的:
●两个操作数必须是同样大小。
●两个操作数不能都是内存操作数。
●指令指针寄存器(IP、EIP或RIP) 不能作为目的操作数。
下面是MOV指令的标准格式:
MOV reg, reg
MOV mem, reg
MoV reg, mem
MOV mem, imm
MOV reg, imm
64位mov
当将一个8位、16位、32位常数送人64位寄存器时,目的操作数的高位被清零
ExitProcess PROTO ;函数的声明不需要参数 .data n DWORD 2,4,6,8,10 .code main PROC mov rax, 0FFFFFFFFh ;32位常数 mov rbx, 6666h ;16位常数 mov rcx, 55h ;8位常数 ;RAX = 00000000FFFFFFFFh RBX = 0000000000006666h RCX = 0000000000000055h mov ecx,0 ;结束程序 call ExitProcess ;64位版本的MASM不支持INVOKE伪指令。 main ENDP END ;END伪指令没有指定程序入口点, 而32位程序则指定了
特别注意:
当内存操作数送入64位寄存器时,结果会有所不同:
传送一个32位内存操作数到EAX(RAX的低半部分) , 就会清零RAX的高32位
当将8位或16位内存操作数送入RAX的低位时, 则目的寄存器的高位不受影响
ExitProcess PROTO myDword DWORD 80000000h myByte BYTE 55h myWord WORD 6666h .code main PROC mov rax, 0FFFFFFFFFFFFFFFFh mov eax, myDword ;RAX = 0000000080000000h 高位清零 mov rbx, 0FFFFFFFFFFFFFFFFh mov bx, myWord ;RBX = FFFFFFFFFFFF6666 高位不清零 mov rcx, 0FFFFFFFFFFFFFFFFh mov cl, myByte ;RCX = FFFFFFFFFFFFFF55 高位不清零 mov ecx,0 ;结束程序 call ExitProcess main ENDP END
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
2021-11-10 opencv-compare比较