汇编语言

1. 数据宽度

类型大小范围
bit1位0~1
Byte8位0~0xFF
Word16位0~0xFFFF
DWord(Double Word)32位0~0x FFFF FFFF
QWord(Quad Word)64位0~0x FFFF FFFF FFFF FFFF

2. 有符号数与无符号数

  • 无符号数
1 0 0 1  1 0 1 0 十六进制:0x9A	十进制:154
  • 有符号数,最高位是符号位:1(负数),0(正数)

  • 原码反码补码

    • 原码:最高位是符号位
    • 反码:
      • 正数:反码和原码相同
      • 负数:符号位是1,对原码的其余位取反
    • 补码:
      • 正数:反码和原码相同
      • 负数:符号位是1,对原码的其余位取反再加1

3. 位运算实现加减乘除

4 + 5 ?

# 计算机实现加运算
0000 0100
0000 0101
-------------
0000 1001

# 计算机实现原理
# 第一步:异或,如果不考虑进位,异或就可直接出结果
0000 0100
0000 0101
-------------
0000 0001

# 第二步:与运算(判断进位,如果与运算结果为0,没有进位)
0000 0100
0000 0101
-------------
0000 0100

# 第三步:将与运算的结果,左移一位
0000 1000

# 第四步:将第一步与第三步结果异或
0000 0001
0000 1000
-------------
0000 0101

# 第五步:与运算(判断进位,如果与运算结果为0,则没有进位)
0000 0001
0000 1000
-------------
0000 0000

# 最终结果是第四步的结果

4 - 5 ?

# 计算机实现减法
4 + (-5): 4 + 5的补码
(-5的补码): 1111 1011

# 第一步:异或
0000 0100
1111 1011
-------------
1111 1111

# 第二步:与运算
0000 0100
1111 1011
-------------
0000 0000

# 第三步:将与运算的结果,左移一位
0000 0000

# 第四步:将第一步与第三步结果异或
1111 1111
0000 0000
-------------
1111 1111

# 第五步:与运算,将第一步与第四步结果与一下(判断进位,如果与运算结果为0,则没有进位)
1111 1111
0000 0000
-------------
0000 0000

4 * 5 ?:加法 + 移位

4 / 5 ?:减法 + 移位

4. 汇编语言

4.1 OD (Ollydbg)

  • Ollydbg 通常称作OD,是反汇编工作的常用工具

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1ShcBSgS-1614050984542)(https://gitee.com/njuxyf/PictureBed/raw/master/CS-Notes/image-20210223093823720.png)]

4.2 寄存器

  • 32位CPU 8 16 32
  • 64位CPU 8 16 32 64

通用寄存器:32位的通用寄存器只有8个

image-20210223100513697

存值的范围:0 ~ 0xFFFFFFFF

mov指令:修改计算机中的值

mov	存的地址, 存的数		# 将存的数传给地址
mov 存的地址1, 存的地址2	# 将地址2中的值传给地址1

Eg:

mov eax, 1

mov ecx, eax

通用的寄存器

FFFF FFFF	 FFFF	   FF
32位			16位		8位
EAX			 AX		  AL
ECX			 CX		  CL
EDX			 DX		  DL
EBX			 BX		  BL
ESP			 SP		  AH
ENP			 NP		  CH
ESI			 SI		  DH
EDI			 DI		  BH

L代表低8位,H代表高8位

除了通用寄存器外,其他的所有寄存器每一位都有自己特定的功能

4.3 内存

每个内存地址都有一个编号,可以通过这些编号向内存里存值。

image-20210223104623893

表示地址的六种方式

形式一:立即数(内存)

读取内存的值
mov eax,dword ptr ds:[0x13FFC4]

向内存中写入数据
mov dword ptr ds:[0X13FFC4],eax

形式二:[立即数+偏置]

ds:[0x13FFC0+4]

形式三:[寄存器]

读取内存的值
move ecx,0x13FFD0
mov eax,dword ptr ds:[ecx]

向内存中写入数据
mov edx,0x13FFD8
mov dword ptr ds:[edx],0x87654321

形式四:[寄存器+偏置]

读取内存的值
mov ecx,0x13FFD0
mov eax,dword ptr ds:[ecx+4]

向内存中写入数据
mov edx,0x13FFD8
mov dword ptr ds:[edx+0xC],0x87654321

形式五:[寄存器+寄存器*{1,2,4,8}]

读取内存的值
mov eax,13FFC4
mov ecx,2
mov edx,dword ptr ds:[eax+eax*4]

向内存中写入数据
mov eax,13FFC4
mov ecx,2
mov dword ptr ds:[eax+eax*4],0x87654321

形式六:[寄存器+寄存器*{1,2,4,8}+偏置]

读取内存的值
mov eax,13FFC4
mov ecx,2
mov edx,dword ptr ds:[eax+eax*4+4]

向内存中写入数据
mov eax,13FFC4
mov ecx,2
mov dword ptr ds:[eax+eax*4+4],0x87654321

5. 汇编语言常用指令

一、常用指令:MOV指令、ADD指令、SUB指令、AND指令、OR指令、XOR指令、NOT指令
MOV 的语法:
MOV r/mX,rX r 通用寄存器,X 表示位数可以8、16、32
MOV rX,r/mX m 代表内存
MOV rX, immX imm 代表立即数
1、源操作数可以是立即数、通用寄存器、段寄存器、或者内存单元.
2、目标操作数可以是通用寄存器、段寄存器或者内存单元.
3、操作数的宽度必须一样.
4、源操作数和目标操作数不能同时为内存单元.
mov dword ptr ds:[0x0012FF34],0x12345678 的含义:

dword :要读/写多少此时是4字节 byte == 1字节 word == 2字节
ptr::Pointer 代表指针 (指针的意思就是里面存的不是普通的值,而是个地址)
ds:Data Segment 段寄存器
0x0012FF34:内存编号,必须是32位的 前面0可以省略
注意:地址编号不要随便写,因为内存是有保护的,并不是所有的内存都可以直接读写(需要特别处理)

ADC指令:带进位加法
格式:ADC R/M,R/M/IMM 两边不能同时为内存 宽度要一样
SBB指令:带借位减法
格式同上;
XCHG指令:交换数据
格式同上;
MOVS指令:移动数据 内存-内存
MOVS BYTE|WORD|DWORD PTR ES:[EDI],BYTE PTR DS:[ESI]
STOS指令:讲Al/AX/EAX的值存储到[EDI]指定的内存单元
STOS BYTEBYTE|WORD|DWORD PTR ES:[EDI]
REP指令:按计数寄存器 (ECX) 中指定的次数重复执行字符串指令

MOVSX 先符号扩展,再传送
MOV AL,80
MOVSX CX,AL
MOVZX 先零扩展,再传送.
MOV AL,80
MOVSX CX,AL

二、寄存器与内存区别:
1、寄存器位于CPU内部,执行速度快,但比较贵。
2、内存速度相对较慢,但成本较低,所以可以做的很大
3、寄存器和内存没有本质区别,都是用于存储数据的容器,都是定宽的。
4、寄存器常用的有8个:EAX、ECX、EDX、EBX、ESP、EBP、ESI、EDI。
5、计算机中的几个常用计量单位:BYTE WORD DWORD QWORD
我们称计算机CPU是32位或者64位,主要指的就是内存编号的宽度,而不是寄存器的宽度。计算机内存的每一个字节会有一个编号,就是地址值。

三、寻址方式
寻址公式一:[立即数]
MOV EAX,DWORD PTR DS:[0x13FFC4] ;读取内存的值:
MOV DWORD PTR DS:[0x13FFC4],eax ;MOV DWORD PTR DS:[0x13FFC4],eax
LEA EAX,DWORD PTR DS:[0X13FFC4] ;获取内存编号:实际上就是0X13FFC4
寻址公式二:[reg] reg代表寄存器 可以是8个通用寄存器中的任意一个
同上,只是0x13FFC4 改成 寄存器;MOV EAX,DWORD PTR DS:[ECX]
寻址公式三:[reg+立即数]
MOV EAX,DWORD PTR DS:[ECX+4]
寻址公式四:[reg+reg*{1,2,4,8}]
MOV EDX,DWORD PTR DS:[EAX+ECX4]
寻址公式五:[reg+reg
{1,2,4,8}+立即数]
MOV EDX,DWORD PTR DS:[EAX+ECX*4+4]

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
VSCode是一款功能强大的代码编辑器,它可以用于编写各种编程语言,包括汇编语言。要在VSCode中编写汇编语言程序,可以按照以下步骤进行: 1. 下载和安装VSCode编辑器。在安装过程中,确保选择适用于您的操作系统的版本。 2. 启动VSCode并打开扩展视图。您可以点击左侧导航栏中的方块图标,或使用快捷键Ctrl+Shift+X(Windows)/Cmd+Shift+X(Mac)。 3. 在扩展视图中,搜索并安装适用于汇编语言的扩展。您可以在搜索框中输入"Assembly"或"汇编"来查找相关的扩展。找到适合您的汇编语言的扩展后,点击"安装"按钮进行安装。 4. 安装完扩展后,您可以创建一个新的文件来编写汇编语言程序。点击VSCode顶部菜单的"文件"选项,然后选择"新建文件"。在新建的文件中,您可以输入您的汇编语言代码。 5. 编写完汇编语言代码后,您可以保存文件。点击菜单中的"文件"选项,选择"保存"或使用快捷键Ctrl+S(Windows)/Cmd+S(Mac)。 6. 在保存文件后,您可以通过点击顶部菜单的"调试"选项,然后选择"启动调试"来运行您的汇编语言程序。在调试过程中,您可以查看变量的值、设置断点等。 总结:要在VSCode中编写汇编语言程序,您需要下载和安装VSCode编辑器,并安装适用于汇编语言的扩展。然后,您可以创建一个新的文件来编写汇编语言代码,并通过调试功能来运行程序。希望对您有所帮助!

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值