Mov操作规则:
1.两个操作数的尺寸必须一致
2.两个操作数不能同时为内存操作数
3.目的操作数不能是CS,EIP和IP
4.立即数不能自己送至寄存器
MovZx(零扩展传送)指令:无符号整数使用
eg:
mov bl,11111111b
mov eax,bl
MOVSX(符号扩展传送)前面补0
LAHF:将EFLAGS的低字节复制到AH寄存器
SAHF:将AH寄存器的值恢复到EFLAGS中
xCHG:交换两个数,不支持立即数
直接偏移操作数:
eg:
var1 byte 1ah,2ah
.code
mov ah,var1 1ah
mov ah,var1+1 2ah
加法减法:
inc/dec
inc reg/mem
dec reg/mem
ADD dec,source 只能操作相同尺寸的操作数
Sub dec,source 同上,结果存储在dec中
neg 得到操作数的补码
CF(进位标志位) inc和Dec指令不影响进位标志位,neg总是改变cf
AC(辅助标志位) 最低字节的第3位向第4位进位,则设置
加法测试:
在两个有符号整数相加的时候,以下情况说明发生了溢出
1.两个正数相加的和是负数
2.两个负数相加的和是正数
CPU是如何检测溢出的:
使用进位标志 xor 结果的最高有效位
4.3 和数据相关的操作符合伪指令
1.OFFSET 返回数据标号的偏移地址
2.PTR 重载操作数的默认尺寸
eg:
.data varb dword 01aah
.code mov ax,word ptr varb
eg.将较小值送较大的目的操作数
.data vara word 1h,2h
.code mov eax,dword ptr vara
3.TYPE 按字节计算单个元素大小
4.LENGTHOF 计算数组元素的数目
5.SIZEOF 返回TYPE*LENGTHOF
6.ALIGN 将变量的位置按字节,字,双字或段边界对齐
TYPDEF 允许创建自定义类型
eg: pbyte typdef ptr byte 声明在数据段之前
JMP:
jmp 目的地址
LOOP:
loop 目的地址
步骤:
首先,ecx减1,接着与0相比较,不能与0就跳转到目标标号处