多数情况下,64位模式中的64位指令与32位模式中的操作数是一样的,比如源操作数是16/8位常数,而目标操作数是64位的内存操作数或者64位的寄存器,那么目标操作数中的所有位都会受到影响。
.data
;在这里声明变量
val qword 0ffffffffffffffffh;
.code
;这里写自己的代码
mov rax,val; RAX=FFFFFFFFFFFFFFFF
and rax,80h; RAX=0000000000000080
mov rax,val; RAX=FFFFFFFFFFFFFFFF
and rax,8080h; RAX=0000000000008080
mov rax,val; RAX=FFFFFFFFFFFFFFFF
and rax,808080h; RAX=0000000000808080
源操作数不能为16/8位内存操作数或者寄存器,因为操作数大小不匹配。
如果源操作数是32位的常数,而目标操作数是64位的内存操作数或者64位的寄存器,那么目标操作数只有低32位会受到影响,高32位不变。
mov rax,val RAX=FFFFFFFFFFFFFFFF
and rax,80808080h RAX=FFFFFFFF80808080
总而言之,32位操作数是一个特殊情况,需要与其它大小的操作数分开考虑。