4.1数据传送指令
知识点:
2.操作数类型
立即操作数,寄存器操作数,内存操作数
r8 8位通用寄存器
r16 16位通用寄存器
r32 32位通用寄存器
reg 寄存器
sreg 16位段寄存器
imm 8,16,32位立即数
imm8
imm16
imm32
r/m8 8位寄存器/内存 操作数
r/m16
r/m32
mem 8,16,32 内存操作数
3.直接内存操作数
mov eax,val1
mov eax,[val1] ;不常用
4 MOV 指令
1.操作数尺寸必须一致
2.不能同时为内存操作数
3.目的操作数不能使CS,EIP,IP
4.立即数不能直接送到段寄存器
mov reg,reg
mov mem,reg
mov reg,mem
mov mem,imm
mov reg,imm
内存数据的移动,要通过寄存器转移,不能直接mov 两个内存操作数。
5.整数的零/符号扩展
当将16位数据送入EAX的时候,虽然MOV 指令必须要用 AX作为操作数,但是要考虑AX高16位旧数据的问题。
.data
var1 WORD 1
.CODE
mov eax,0 ; 因此最好在之前将eax 清零
mov ax,var
但是针对赋值,不能直接清0,要用FFFFFFFFH填充。
movzx 0 扩展指令
movzx r32,r/m16
movzx r32,r/m8
movzx r16,r/m8
因为是用0扩展最高有效位,所以只能用于无符号数
movsx 符号位扩展
movsx r32,r/m16
movsx r32,r/m8
movsx r16,r/m8
6.LAHF,SAHF
LOAD STATUS FLAGS INTO AH
STORE AH INTO EFLAGS
AH<---->EFLAG 低字节
7.XCHG
数据交换指令
XCHG REG,REG
XCHG REG,MEM
XCHG MEM,REG
8.直接偏移操作数
变量偏移地址 + 常数
array BYTE 10H,20H,30H,40H
MOV AL,[array + 1] ; al= 20h
MOV AL,array + 1 ; 两条语句等价
MASM并不对数组的下标进行检查,所以程序员要保证数组下标不越界。
字和双字节数组:
.data
arrayW WORD 100h,200h,300h
mov AX,[array + 2] ;偏移量按照字节计算,所以双字就要+4
例子程序:
注意:上传附件及图片大小不得大于30M。
⚠️ 版权声明:
本博客所有内容(含教程、源码、工具)仅供个人技术学习与研究交流使用,严禁商用、倒卖、二次分发及非法用途。
未经作者书面授权,任何组织或个人不得转载、复制或用于其他平台,违者将追究相关责任。
