汇编语言

回眸只為那壹抹淺笑 提交于 2020-02-28 03:40:43

1+1=3?

进制可以自己定义符号来表示,所以可以自己定义一个十进制:0 1 3 9 6 8 7 4 5 2
在这样的定义下,1+1=3也是正确的。(从本质来理解进制)

进制运算

在这里插入图片描述
在这里插入图片描述
运算 534+266=? 371*146=?

与十进制运算一样,通过查表来运算。
534+266 先查表找4+6=12 所以最后一位就是2 往前进1
然后找3+6 =11 ,所以第二位是2 往前进1
最后找5+2=7 ,所以是0 往前进1.
最后结果为1022
乘法也是一样通过查表来获得结果。

数据宽度

BIT 位 计算机中的最小存储单位
Byte 字节 1字节=8位
Word 字 1字=16位
Doubleword 双字 1双字=32位

有符号数和无符号数

正数的原码反码补码都一样。
负数的原码:符号位为1.其余为数值本身的绝对值。
负数的反码:符号位为1.其余位对原码取反。
负数的补码:符号位为1,其余位对原码取反+1

-7
原码为:1000 0111
反码为: 1111 1000
补码为:1111 1001
负数在内存中以补码的形式存储

计算机不会做加法

移位操作
shr 右移 最高位补0
sar 右移 最高位补符号位

4+5的运算过程
在没有进位的情况下,两个数异或的结果和相加的结果是一样的。
1)异或
0000 0100
0000 0101
异或-----------------
0000 0001
两个数在相同位位1时,才会有进位,所以使用来判断有没有进位。
2)判断是否有进位
0000 0100
0000 0101
与-----------------
0000 0100 结果不为0,说明有进位,继续运算。
3)继续异或

	0000 0001
	0000 1000       把第一次异或的结果和第二次**与**的结果左移移位继续异或操作

异或-----------------
0000 1001
4)判断是否有进位
0000 0001
0000 1000
与------------------
0000 0000 结果为0,表示没有进位。

这就是一次完整加法的底层过程。

寄存器

CPU一共有8个通用寄存器
I
MOV 指令
<1>立即数到寄存器

mov eax,3

<2>寄存器到寄存器

mov eax,ebx

<3>内存到寄存器

mov eax,[0x12ff7c]

<4>寄存器到内存

mov [0x12ff7c],eax

内存

在这里插入图片描述

内存地址的5种形式
1、[立即数]
读取内存的值:

mov eax,dword ptr ds:[0x12ff70]

向内存中写入数据:

mov dword ptr ds:[0x12ff70],eax

2、[reg] reg代表8个通用寄存器的任意一个

mov dword ptr ds:[eax],0x12345678    eax=0x12ff70

3、[reg+立即数]

mov eax,dword ptr ds:[ecx+4]          ecx=0x12ff70

4、[reg+reg*{1,2,8}]
数组的寻址方式

mov eax,0x12ff70
mov ecx,2
mov edx,dword ptr ds:[eax+ecx*4]

5、[reg+reg*{1,2,8}+立即数]

mov eax,0x12ff70
mov ecx,2
mov edx,dword ptr ds:[eax+ecx*4+4]

**存储模式**
常用指令
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

过调试器F8

调试器F8步过call的原理是把 call的下一条指令修改成CC ,在call的函数里面retn跳转到别的地址,调试器就无法断下来。

				call 010073D1   

010073D1        mov dword ptr ss:[esp],0x10073FA //这是call的函数内部,再次直接跳转到别的地方,不返回到010073d1的下一条指令
			    retn

ESP寻址

堆栈结构
EAX
ESI
EDI
ESP
栈空间
EBP
RETN值
参数1
参数2

EBP寻址

JCC

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!