汇编_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后面不要噢!

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

撒花!❀🎉🎉🎉

相关推荐
CC-NX15 小时前
32位汇编:实验12动态链接库
汇编
资料,小偿21 小时前
4.101基于8086国旗图案proteus8.9,8086彩灯图案流水灯图案,国期图案仿真,四个开关四种模式。近期本人原创
汇编·proteus
资料,小偿4 天前
4.29.3五种波形发生器8086波形发生器,锯齿波脉冲波正弦波三角波直流信号含调试视频➕18页5000字原创报告软件流程图proteus8.9近期原创的,
汇编·proteus
T.Ree.4 天前
汇编_读写内存
开发语言·汇编·c#
量子炒饭大师5 天前
【一天一个计算机知识】—— 【编程百度】翻译环境与运行环境
c语言·汇编·c++·gitee·机器翻译
资料,小偿6 天前
4.98基于8086倒车测距8086测距ACD0809proteus8.9仿真,汇编语言源程序
汇编·proteus
万象.7 天前
GNU汇编语法和Cortex-A7常用汇编指令
服务器·汇编·gnu
资料,小偿7 天前
4.95基于8086流水灯霓虹彩灯控制器,8086彩灯控制器proteus8.9仿真文件+源码功能四个开关对应四种模式。
汇编·proteus
YeGop8 天前
51单片机定时器函数分享(8051汇编)
汇编·嵌入式硬件·51单片机