跳转至

数据传送与运算

本章包含的内容: 1.数据传送指令(重点:mov,movzx,movsx) 2.算数运算指令 3.伪指令和操作符(重点:offset,ptr,label) 4.循环语句 5.内存操作数与寻址方式

数据传送指令

mov指令

MOV指令

mov - Move(Opcodes:88,89,8A,8B,8C,8E...) 语法: + mov <reg>,<reg> + mov <reg>,<mem> + mov <mem>,<reg> + mov <reg>,<imm> + mov <mem>,<imm> 例子: mov BYTE ptr[var],5

解释: <reg>:寄存器 <mem>:内存操作数(类似C++已经定义的变量) <imm>:及时操作数(类似C++临时变量,或者是临时lambda

movzx - 整数的零扩展 movsx - 符号扩展传送指令

LAFH、SAHF指令

XCHG指令

e.g.使用XCHG指令实现C++的swap函数:交换两个内存操作数的值

.data
  var1 DWORD 100h
  var2 DWORD 200h
.code
  mov var1,eax
  xchg eax,var2
  mov eax,var1

算数运算指令

INC指令、DEC指令

INC指令使得操作数加1; DEC指令从操作数减1;

两者的语法相同:

inc <reg>
inc <mem>

ADD指令、SUB指令

\[ADD <Src>,<Dest>\]

ADD将相同尺寸的源操作数和目的操作数相加,相加的结果存储在目的操作数中。

NEG指令

伪指令和操作符

OFFSET操作符

OFFSET操作符返回数据标号的偏移地址。 OFFSET操作符获得的偏移地址占用4个字节。

PTR操作符

PTR操作符可以重载操作数声明的默认尺寸。

.data
  var1 WORD 1234h
  var2 WORD 5678h
.code
  mov eax,DWORD PTR var1
  ;寄存器eax的十六进制值是56781234h

TYPE操作符

返回变量的字节数

LENGTHOF操作符

SIZEOF操作符

LABEL伪指令

循环语句

MASM32汇编程序如何实现循环?

程序通过控制转移改变汇编语言执行顺序的方法 - 无条件控制转移、条件控制转移

一般来说,一个汇编循环体的常见的结构如下:

MOV CX, 5         ; 设置循环次数为5次
LOOP_START:
    ; 循环体代码
    ; 可以在这里执行需要重复的操作
    DEC CX         ; 循环次数减1
    JNZ LOOP_START  ; 如果CX寄存器不为0,则继续循环

CMP指令

LOOP指令

  • LOOP 〈目的地址〉

LOOP循环执行的内层逻辑: ECX寄存器为循环计数器 LOOP指令执行时,ECX减一

如果ECX不等于0,

内存操作数和寻址方式

间接寻址

任何一个32位寄存器