汇编-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  
复制代码

 

 

 

 

 

 

 

 

 

posted @   天子骄龙  阅读(776)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
历史上的今天:
2021-11-10 opencv-compare比较
点击右上角即可分享
微信分享提示

目录导航