汇编

2021/7/21 1:35:47

本文主要是介绍汇编,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

汇编

概述

语言

进制

进制如何运算

二进制

数据宽度

有符号数和无符号数

原码反码补码

汇编指令

内存复制

堆栈的指令

汇编如何写函数

堆栈传参

堆栈平衡

外挂

语言

什么是机器语言

# 电子计算机
状态:0 和 1
# 最早的程序员,穿孔卡带

简化,助记符。

加 INC -编译器-> 
减 DEC
乘 MUL
除 DIV

离程序的本质:隔阂!灰白你一般用于底层的编写,单片机..

C语言

加 A+B
减 A-B
乘 A*B
除 A/B

进制

1进制:一进一,结绳计数。

2进制:二进制,计算机

八进制:八进一。8个符号组成:0 1 2 3 4 5 6 7

十进制:十进一。10个符号组成:0 1 2 3 4 5 6 7 8 9

十六进制:十六进一。16个符号组成:0 1 2 3 4 5 6 7 8 9 A B C D E F

进制运算

8进制逢八进一

加法

1+1=2
1+2=3 2+2=4
1+3=4 2+3=5 3+3=6
1+4=5 2+4=6 3+4=7 4+4=10
1+5=6 2+5=7 3+5=10 4+5=11 5+5=12
1+6=7 2+6=10 3+6=11 4+6=12 5+6=13 6+6=14
1+7=10 2+7=11 3+7=12 4+7=13 5+7=14 6+7=15 7+7=16

乘法

1*1=1
1*2=2 2*2=4
1*3=3 2*3=6 3*3=11
1*4=4 2*4=10 3*4=14 4*4=20
1*5=5 2*5=12 3*5=17 4*5=24 5*5=31
1*6=6 2*6=14 3*6=22 4*6=30 5*6= 36 6*6=44
1*7=7 2*7=16 3*7=25 4*7=34 5*7=43 6*7=52 7*7=61

二进制

0  1  10  11  100  101  110  111  1000  1001  1010  1011  1100  1101  1110  1111
0  1  2   3   4     5    6    7    8     9     A     B     C     D     E     F

数据宽度

bit 一个位,0or1

Byte 八个位为一个字节,0000 0000,1111 1111。0~0xFF

Word 两个字节为一个字,也就是十六个位。0~0xFFFF

DWord 四个字节为一个双字,也就是三十二个位0~0XFFFFFFFF

QWord 八个字节为一个四字,也就是六十四个位0~0xFFFFFFFFFFFFFFFF

有符号数和无符号数

无符号数规则

数字是什么,就是什么

1001 1010 十六进制,0x9A

有符号数规则

最高位是符号位:1(负数) 0(正数)

1001 1010

原码反码补码

编码规则

原码:最高位符号位,对齐它的位进行本身绝对值即可。

反码:

  • 正数:反码和原码相同
  • 负数:符号位一定是1,其余位对原码取反。

补码:

  • 正数:补码和原码相同
  • 负数:符号位一定是1,反码加一

测试

# 都是8位
# 如果是正数,那都是一样的
1
# 原码 0 0 0 0  0 0 0 1
# 反码 0 0 0 0  0 0 0 1
# 补码 0 0 0 0  0 0 0 1

# 如果是负数
-1
# 原码 1 0 0 0  0 0 0 1
# 反码 1 1 1 1  1 1 1 0
# 补码 1 1 1 1  1 1 1 1

-7
# 原码 1 0 0 0  0 1 1 1
# 反码 1 1 1 1  1 0 0 0
# 补码 1 1 1 1  1 0 0 1

负数存放的是补码

位运算

与运算(and &)

两个都是一,结果才为一。

或运算(or |)

两个有一个为一,结果就是一。

异或运算(xor ^)

相同就为0,不同为1

非运算(单目运算符 not~)

0就是1,1就是0 。

0000 0001	1
0000 0010	2
0000 0100	4
0000 1000	8

通过这些完成加减乘除!位运算来实现加减乘除。

位运算(移动位)

左移:(shl <<)

0000 0001	所有二进制位全部左移若干位,高位就丢弃了,低位补0 。

右移:(shr >>)

0000 0001	所有二进制全部右移若干位,低位丢弃,高位补0 。

位运算的加减乘除

基本数学的加减乘除(加法)

4+5

# 计算机时怎么操作的
0000 0100
0000 0101
----------
0000 1001

# 第一步 异或:如果不考虑进位,异或就可以直接出结果
0000 0100
0000 0101
----------
0000 0001

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

# 第三步 将与运算的结果,左移一位. 如果结果为0,则不左移。

# 第四步 异或
0000 0001
0000 1000
----------
0000 1001

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

# 所以最终的结果就是与运算为0的结果的上一个异或。

4-5

# 计算机时怎么操作的
4+(-5)

0000 0100
1111 1011	0000 0101的反码是1111 1010 
					  补码是1111 1011
---------
1111 1111 ff(也就是-1)

0000 0100
1111 1011
----------异或(如果不考虑进位,异或就可以直接出结果。)
1111 1111

0000 0100
1111 1011
---------与(判断进位,如果与运算结果为0,没有进位)
0000 0000
# 所以最终的结果就是与运算为0的结果的上一个异或。


这篇关于汇编的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程