汇编语言学习一(有栈协程铺垫,32位寄存器和相关指令学习,未完待续7/4)

  • 背景举例
操作举例:把ebx的内容移动到eax中
机器指令:由0和1组成的序列
汇编指令:mov    eax  ,ebx (寄存器)

一、进制

16进制

89D8
1000 1001 1101 1000

在这里插入图片描述

二、寄存器介绍

(1)数据寄存器

  • 寄存器介绍
    CPU上的一个元件,CPU的组成部分之一,读写速度非常快
1)数据寄存器介绍

保存操作数,保存需要传递的数据(0和1),保存计算结果

2)数据寄存器分类

1)EAX:累加寄存器,也称之为累加器。举例1+1=2,会把2放到eax里面
2)EBX:基地址寄存器,存放地址的寄存器
3)ECX:计数器寄存器,比如说写一个for循环,循环5次,5这个放在计数寄存器
4)EDX:数据寄存器,一般放需要的数据,for循环有个值是5,一般放在EDX

EAX,EBX,ECX,EDX为32位寄存器
AX,BX,CX,DX位16位寄存器
低八位:al
高八位:ah

  • 使用指令结果展示
    1)mov eax , 0x100
    在这里插入图片描述
    2)mov ax ,0x10 (16位寄存器)
    在这里插入图片描述
    3)mov ah,0x1 (高8位)
    在这里插入图片描述

(2)指针寄存器

1)指针寄存器分类

操作栈的寄存器

ESP:保存指向栈顶的指针
EBP:保存指向栈底的指针

  • 补充:栈的定义

保存栈的参数和变量
在这里插入图片描述

2)操作指针寄存器实例

1)push eax前
eax的值: 0019FFCC
堆栈信息:(0019FF70存的是0019FF80,栈底的地址)
在这里插入图片描述
2)push eax后
栈数据的变化:(由于是32位的exe,0019FF70栈顶向栈底偏移4个字节的长度,就是0019FF6C)
0019FF6C变为栈顶指针,栈顶指针存的数据变成原先eax的值0019FFCC
在这里插入图片描述

(3)变址寄存器

1)变址寄存器介绍

指寄存器ESI,EDI,SI,DI的寄存器,主要用于存放存储单元在段内的偏移量

2)作用介绍(了解一下,没啥特点)

ESI:存放地址的寄存器
EDI:存放地址的寄存器

在这里插入图片描述

(4)指令指针寄存器

EIP寄存器:由存断点的位置表示出来(保存CPU下一次将要执行代码的地址)
在这里插入图片描述
当执行到004013A5 68 D41E4000 push TraceMe.004040D0,push指令会把下一步执行代码的地址压栈,原先栈顶指针0019FF6C就变成0019FF68,且值变为004040D0,这就是EIP寄存器的作用

(5)标志寄存器

1)标志寄存器介绍和作用

EFL标志寄存器:也叫flag寄存器,占16位的大小
在这里插入图片描述

2)举例标志寄存器中:ZF寄存器的作用

(做运算就会影响ZF位)
在这里插入图片描述

3)举例截图说明

EFL:246的16进制

1001000110
在这里插入图片描述
sub esp,0x58 (由于esp减0x58不为0,ZF位置为0;当结果为0,ZF就置为1)
在这里插入图片描述

(6)段寄存器

1)段寄存器作用

因为对内存的分段管理而设置的。计算机需要对内存分段,用来给不同的程序使用

  • 截图(红色方框部分)
    在这里插入图片描述
2)段寄存器分类(不止6个,只是OD显示了6个)

ES:
CS:
SS:
DS:
FS:
GS:

3)段寄存器使用举例
mov dword ptr ds:[0x405528] , edx 

解释:
把edx的值移动到ds.base+0x405528这个地址里面

4)段寄存器简单拆分

在这里插入图片描述
可见部分仅仅显示了16位,例如上图中的002B的2B
②不可见部分的Base:段开始的地方,举例比如说程序使用的内存是分段的,从1到10是一整段,像base就是1,+0x405528就是10,1到10就是一个程序用的一整段;上述举例的意思就是:edx的值放在一段地址里面
③Limit: 比如从1到10,11到20,那么10就是limit
④Attribute:属性,定义了这个段是否可读可写可执行

三、指令介绍

(1)数据传送指令(mov指令)

  • 使用举例

move ebp,esp //把栈顶的数据移动到栈底

1)移动前
ESP:0019FF74
EBP:0019FF80
在这里插入图片描述

2)移动后
在这里插入图片描述

  • 注意点:
    1)位数大小一样的才能相互移动
    2)不能用寄存器给立即数赋值

mov 123,esp

(2)加减运算指令

  • 指令分类
    add:加法
    sub:减法
  • 使用举例:

mov eax,0x0
add eax, 0x8 //eax变成0x0000008了

(3)逻辑运算

  • 逻辑运算分类
    逻辑与:and,同为1才为1
    逻辑或:or,只要一个为1,就是1
    逻辑异或: xor,同为0,异为1
    逻辑非:not,0变成1,1变成0
  • 使用举例
mov eax , 1
and  eax  , 2   //现在eax就是0

(4)移位指令

1)算术移位指令
  • 分类
    1)算术左移指令SAL:左移n次,等用于乘上2的n次幂,(高位放到标志寄存器的CF位),低位补0
    2)算术右移指令SAR:右移n次,等于/2的n次幂(低位放入标志寄存器的CF位),高位补0
    在这里插入图片描述
  • 使用举例
mov  eax,2
sal    eax,1

00000010 ->  00000100
2)逻辑移位指令

逻辑左移SHL:同SAL,高位入CF,最低位补0,最高位入CF
逻辑右移SHR:右移1次,最高位补0,最低位入CF
在这里插入图片描述

(5)test、cmp指令

1)test指令
  • 作用
    做逻辑与运算(and),和与逻辑(and)不同的是,test指令不会影响寄存器的值,但是会影响标志位ZF的值(缩写Z)
  • 举例
and eax , 0x01  //若eax的值0号位是0,那么eax就变成0
//and不会改变标志寄存器的值

test eax,1 //eax的值没有改变,Z值变化:若eax做与运算,结果为0,则Z标志位为1

在这里插入图片描述

2)cmp指令
  • 作用
    实际上做减法运算(sub),不改变原来的值,只是改变ZF标志位(等于0置为1)
  • 代码举例
sub eax,0x01  //不为0

在这里插入图片描述

(6)push、pop指令

1)push指令
2)pop指令

(7)jmp、nop指令

1)jmp指令
2)nop指令

(8)jcc指令

(9)call、retn指令

1)call指令
2)retn指令

传送门

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值