1. MOV指令
MOV destination,source
Mov指令对操作数的使用是非常灵活的,只要遵循以下的规则即可:
●两个操作数的尺寸必须一致。
●两个操作数不能同时为内存操作数。
●目的操作数不能是CS,EIP和IP。
●立即数不能直接送至段寄存器。
2. 整数的零/符号扩展
当试图使用MOV指令将整数值从一个较小的操作数中拷贝到一个较大的操作数中时,可能会导致错误,但有时确实需要这样移动数据。
(1) MOVZX(move with zero-extend)指令将源操作数的内容拷贝到目的操作数中,并将该值零扩展(zero-extend)至16位或32位,目的操作数必须是寄存器。
(2) MOVSX (move with sign-extend)指令将源操作数的内容拷贝到目的操作数小,并将该值符号扩展(sign-extend)至16或32位。目的操作数必须是寄存器。
3. LAHF和SAHF指令
(1)LAHF(load status flag into AH),指令将EFLAGS寄存器的低字节拷贝至AH寄存器,被拷贝的标志包括:符号标志、零标志、辅助进位标志、奇偶标志和进位标志。
(2)SAHF(store )指令拷贝AH寄存器的值至EFLAGs寄存器的低字节
4. XCHG指令:交换两个操作数内容,其操作数遵循与MOV同样的规则。若要交换两个内存操作数.需要使用寄存器作为临时存储用。
5. 直接偏移操作数
在变量名称后加上一个偏移值,可以创建直接偏移(direct-offset)操作数,
例如:
arrayB BYTE 10h,20h,30h,40h,50h
mov al,arrayB ;AL=10
mov al,[arrayB+1] ;
mov al,[arrayB+2] ;AL=30
像arrayB+1的这样表达式被称为有效地址(effective address),有效地址通过在变量偏移地址后面加上一个常数来表示。当我们将有效地址用方括号括起来的时候就表明我们要引用这个表达式以获取目标内存地址的内容。MASM并不要求一定要使用方括号。
在使用十六位的字数组的时候请记住,每个数组元素与前一个元素的偏移相差两字节。双字数组的第二个元素与第一元素的偏移相距4字节。