汇编_mov指令

【本节目标】

  1. 明确汇编的定义
  2. 记住有哪些寄存器(名称),以及其对应的编号(0~7),多少位(32 16 8)
  3. 学会使用mov指令
  4. 掌握书写汇编的基本格式

1. 什么是汇编

汇编就是寄存器与寄存器,寄存器与内存,内存与寄存器之间来回移动数据(不能同时操作内存,特殊指令除外,编译器不支持)

2. 寄存器

寄存器是放内存数据的

2.1 32位的寄存器:

1111 1111 1111 1111 1111 1111 1111 1111(f f f f f f f f)

寄存器 类型 用途
EAX(0) 累加寄存器(A->add) 用于算术运算、逻辑操作和函数返回值。
ECX(1) 计数寄存器(C->count) 常用于循环和字符串操作的计数。
EDX(2) 数据寄存器(D->data) 常用于I/O操作和与EAX配合进行乘除法运算(存放高位结果)
EBX(3) 基址寄存器(B->base) 常用于指向数据段中的基地址。
ESP(4) 对堆栈操作的寄存器 esp是栈顶(stack) 指向当前栈帧的顶部。随着PUSH/POP操作而变化。
EBP(5) 对堆栈操作的寄存器 ebp是栈底 指向当前栈帧的底部,用于访问函数参数和局部变量。
ESI(6) 对字符串操作的寄存器 在字符串或内存块操作中,指向源数据。
EDI(7) 对字符串操作的寄存器 在字符串或内存块操作中,指向目标地址。
EIP 指令指针寄存器 存放下一条要执行的指令的地址。程序员不能直接修改它,但可以通过跳转、调用、返回等指令改变其值。
EFLAGS 标志寄存器 一个32位的寄存器,其中的每一个位(或几个位组合)代表一个特定的状态或控制标志。

(前面几个有编号,也就是括号里面的0~7,一定要记住编号,但是后面两个是没有编号的)
eax ecx edx是通用寄存器,谁都可以用
❗❗注意 :表格里面的用途暂时了解即可!前三个是通用寄存器! 并且ESP EBP不可随意修改,不然可能堆栈会出问题报错 (在特殊情况下可以修改,因为我们要保证堆栈平衡

2.2 16位的寄存器:

1111 1111 1111 1111(f f f f)

AX(0) CX(1) DX(2) BX(3) SP(4) BP(5) SI(6) DI(7) IP FLAGS

(前面几个有编号,也就是括号里面的0~7,一定要记住编号,但是后面两个是没有编号的)
十六位就是在32位的基础上把前面的'E'去掉

2.3 8位寄存器:

1111 1111(f f)

al(0)、cl(1)、dl(2)、bl(3)、ah(4)、ch(5)、dh(6)、bh(7)

补充一个知识:段寄存器

ES(0)、 CS(1)、 SS(2)、 DS(3)、 FS(4)、 GS(5)------存储段

LDTR(6)、 TR(7)------系统段

(目前只需要记住即可,不需要详细了解,后面我们会讲)

段描述符结构:

bash 复制代码
struct segment
{
  word selector;//选择子
  dword base;//基址
  dword limit;//界限
  world attributes;属性
  //段寄存器的完整内部结构是96位
}

2.4 各个寄存器之间的关系

它们之间的关系我们来画图表示:

补充:编译器的几个快捷键

  • f9 ->下断点

  • f5 ->断下来

  • f10和 f11->调试

  • shift+ f5 ->退出调试

  • a/t + 8 -> 进入反汇编

  • f7->编译(看程序有没有错)

那如何查看寄存器呢??

View -> Debug

注意 :寄存器读数时要加上0x表示十六进制,比如图中的EAX=cccccccc,读数时为0xcccccccc

3. mov指令

将第二个操作数(源操作数)复制到第一个操作数(目标操作数)。源操作数可以是立即数、通用寄存器、段寄存器或内存位置;目标寄存器可以是通用寄存器、段寄存器或内存位置。两个操作数的大小必须一样,可以是字节、字或双字。

移动指令

  • mov 目标操作数,源操作数
  • 源操作数:立即数(就是具体数字1 2...) ,通用寄存器,段寄存器,内存
  • 目标操作数:通用寄存器,段寄存器,内存
  • 立即数(imm)、寄存器(register / r)、内存(memory / m)

功能:把源操作数移动到目标操作数

  • 🤔🤔那么怎么写呢?
    • mov ecx,0x12345678
    • mov eax,ecx
    • 特殊:mov al,0x1234这样写不可以,因为0x1234是16位,而al是8位,根本放不下

❗❗注意:源操作数和目标操作数不能同时为内存,因为书写不支持,但特殊指令除外!!
🎇注意1EIP(指令指针寄存器)不可以修改,不然会出问题!!

黄色箭头移动时,寄存器EIP会变化对应的地址

🎇注意2ESP EBP不可随意修改,不然可能堆栈会出问题报错 (在特殊情况下可以修改,因为我们要保证堆栈平衡

4. 汇编的基本格式

bash 复制代码
int main(int argc, char* argv[])
{
	_asm  //关键字
	{
		//汇编指令
	}
	return 0;
}

注意: mov后面不要噢!

那这一节就简单到这里结束咯~

撒花!❀🎉🎉🎉

相关推荐
浩浩测试一下2 天前
汇编 16位32位64位通用寄存器(逆向分析)
汇编·windows·stm32·单片机·嵌入式硬件·逆向·二进制
浩浩测试一下2 天前
汇编常用的(JCC 串 判断)指令 通用寄存器 标志寄存器 段寄存器(逆向分析)
汇编·通用寄存器·逆向二进制·标志寄存器·段寄存器·串 jcc 常用指令
浩浩测试一下3 天前
汇编 标志位寄存器 (逆向分析 )
c语言·汇编·逆向·windows编程·标志寄存器
浩浩测试一下3 天前
汇编 数组与串指令(逆向分析)
汇编·逆向·二进制·免杀·串指令·汇编数组
浩浩测试一下3 天前
汇编 内联汇编与混合编程 (逆向分析)
汇编·混合编程·windows编程·内联汇编·二进制逆向·c语言混合汇编
浩浩测试一下3 天前
汇编 结构体与宏
汇编··免杀·结构体·windows编程·逆向二进制
浩浩测试一下4 天前
汇编中的JCC指令 (逆向分析)
汇编·逆向·标志位·jcc指令·跳转指令·标志位寄存器
浩浩测试一下4 天前
汇编中的段与段寄存器(大小)段序 (逆向分析)
汇编·逆向·二进制·字节序·windows编程·内存地址排序
浩浩测试一下5 天前
汇编 call与ret 函数与堆栈 (逆向分析)
汇编·push·函数·pop·call·ret·堆栈逆向
山屿落星辰5 天前
昇腾NPU算子开发:从“手写汇编“到“搭积木“
汇编