汇编学习笔记
来源:互联网 发布:淘宝宝贝规格图片尺寸 编辑:程序博客网 时间:2024/05/19 02:44
数制基础
常用二进制(B/b结尾)、十进制(D/d结尾)、十六进制(H/h结尾)。
数据组织
位
计算机中最小的单位,一个二进制位。
字节
字节是80806/8088CPU可寻址的最小数据单位,一个字节是8位。一个字节中位的编号从右到左依次是0-7。
字
通常,一个16位,一个字中的编号从右到左依次是0-15。
第0位叫做最低有效位,第15位叫做最高有效位。0-7叫做低位字节,8-15叫做高位字节。
双字
通常,一个32位。一个双字中的编号从右到左依次是0-31.
第0位叫做最低有效位,第31位叫做最高有效位。0-7叫做低字,8-15叫做高字。
数的编码
我们把计算机中表示的二进制数据代码成为机器数,它约定了数据的符号和数据的格式。而机器数代表的实际数值称为真值。
机器数的编码可分为定点数和浮点数两种。定点数又可分为定点整数和定点小数两种。
定点小数表示的是纯小数。在定点小数的机器数编码格式中,规定小数点的位置固定在最高数据位之前,符号位之后,小数点的位置在整个运算过程中是固定不变的。在定点机器中,小数点的位置一经约定,即固定不变,不需要专门的代码指定小数点的位置。
对于一个n+1位的定点二进制小数x=x0x1.....xn其中x0表示符号位,为0则x为正,为1则x为负。
x所能表示的范围-(1-2^(-n))<=x<=(1-2^(-n))
定点整数的机器数编码方法中,规定小数点固定放在最低数据位的右边。对于一个n+1位的定点二进制整数x=x0x1.....xn其中xn表示符号位,为0则x为正,为1则x为负。
x所能表示的范围-(2^n-1)<=x<=-2^n-1
定点小数编码
原码表示法
原码用最高位表示数的符号位,又叫符号-绝对值表示法。
IF x>0 then
x = +0.x1x2....xn
[x]原 = 0.x1x2......xn = x
IF x<0 then
x = -0.x1x2.....xn
[x]原 = 1.x1x2......xn
[x]原 = 1+0.x1x2......xn
[x]原 = 1-(-0.x1x2.....xn)
= 1 - x
IF x=0 then
[+0]原 = 0.00......0
[-0]原 = 1.00......0
x 当0<=x<1
[x]原 = {
1-x 当-1<x<=0
原码表示法简单、直观与真值转换方便。缺点是加减运算不方便。
定点小数表示
补码表示法
一般说:任意一个数x的补码,等于该数加上其模数。模数m为一个正整数,则
[x]补 = m+x (mod m)
IF x>0 then
[x]补 = x + m = x (mod m)
IF x<0 then
[x]补 = x + m = m - |x| (mod m)
IF x=0 then
[+0]补 = [-0]补 = 0.0000
对任意一个n+1位的二进制小数x=x0x1......xn期中x0为符号位,其补码为
x 当0<=x<=1-2^(-n)
[x]补 = {
2-x 当-1<=x<=0 (mod 2)
关于定点二进制小数补码模数m=2的说明:
[x]补max = 0.1111111...111
补码具有以下性质
1.[+0]补 = [-0]补 = 0.0000
2.定点小数的补码中,可表示-1,这是其他编码中做不到的
3.负数的补码求法中,用2减去x的绝对值,可以看做是用1111减去x的绝对值,然后末位加1。因而负数求补码的方法,可用x逐位求反,末位加1得到。
4.关于补码的符号位:
x>=0, [x]补=x>=0,此时x0=0
x<=0, [x]补=2+x>=1,此时x0=1
5.已知[x]补=x0x1...........xn,求x的真值
根据补码的定义,可综合写成[x]补=2x0+x,期中x0为符号位,x为该数的真值,对于正负数均成立。
x = [x]补 - 2x0
= x0.x1x2.........xn-2x0
=-x0+0.x1x2.........xn
=-(x0-0.x1x2........xn)
6.补码的符号扩展及右移规则
已知[x]补=x0.x1x2.......xn,求[x/2]补
由性质5可知:
x = -x0 + 0.x1x2.....xn
= -x0 + x1*2^(-1) + x2*2^(-2)......xn*2^(-n)
x/2 = -x0*2^(-1) + x1*2^(-2)...............xn*2^(-n-1)
= -x0+x0*2^(-1) + x1*2^(-2)...............xn*2^(-n-1)
= -x0 + 0.x0x1x2...........xn
[x/2]补 = 2x0 + x/2 = x0.x0x1x2....xn
反码
反码与补码类似,正数的反码是其本身;负数的反码,只需每位求反即可。
x 当0<=x<1
[x]反 = {
(2-2^(-n))+x 当-1<x<=0
可以把反码看做以(2-2^(-n))为模的补码。因此在反码的运算中当最高位产生进位2时,不能随便扔掉,还必须在最低位加1(2^(-n))才可。
另外反码表示中
[+0]反 = 0.0000.......0
[-0]反 = 1.1111.......1
零的表示不唯一这也是反码的不便之处,但常常用反码作为补码的跳板。
定点整数编码
x = xnxn-1..........x0
xn为符号位
原码
设x=xnxn-1..........x0
x 当0<=x<=2^n-1
[x]原 = {
2^n-x 当-(2^n-1)<=x<=0
[+0]原 = 000000000.....0
[-0]原 = 100000000.....0
补码
x 当 0<=x<=2^n-1
[x]补 = {
2^(N+1)+x 当-2^n<=x<=0 (mod 2^(n+1))
各种性质和定点小数补码性质类似。
[+0]补 = [-0]补 = 00000.........000
10000......0 的真值为 -2^n
反码
x 当 0<=x<=2^n-1
[x]反 = {
(2^(n+1)-1) + x 当 -(2^n-1)<x<=0
移码
[x]移 = 2^n + x,-2^n<=x<=2^n-1
当x为正数时只要将最高位(符号位)加1即可
当x为负数时 [x]移 = 2^n - |x|
例:求x = (±6)D = (±110)B的移码
[(+110)B]移 = 2^3+0110 = 1110
[(-110)B]移 = 2^3-110 = 0010
移码的特点是比较数的大小方便。
浮点数编码
浮点数表示
一部分表示数的有效值,称为尾数M(mantissa),一部分表示该数小数点的位置,称为阶码E(exponent)。
一般计算机中规定阶码E为定点整数,尾数M为定点小数。阶码在浮点运算中只作加减运算,通常采用补码或移码表示。尾数要做加减运算和乘除运算,通常采用补码和原码表示。
浮点数中阶码和尾数的关系,用下式表示
x = MxREx
其中x是一个浮点数,Mx是其尾数,用定点二进制小数表示;Ex是其阶码,用定点二进制整数表示;R是阶的低,可以用2、8或16,通常取2,阶的底与尾数Mx的进位制的基数相同。若阶的底R=2,则Mx为二进制数。一个机器中所有的浮点数阶的底都相同,因此R不表现出来。
规格化数
在浮点数的表示中,一个浮点数可以有多种表示方式,所以提出了规格化的概念。规定尾数最高位数据位不为零,为有效数据。这样要求|Mx|>=R-1。当R=2时,| Mx |>=0.5对于用源码表示的尾数,要求尾数的最高位为1;对于补码表示的尾数,要求数据最高位与尾数符号不同,即Mx = 0.1x…….x.,或Mx=1.0x……..x。
机器零
当一个浮点数,其尾数Mx = 0 不管阶码取何值,都把该浮点数看做零,或者阶码小于其阶码最小值,叫做机器零。此时要求把浮点数的阶码和尾数都清零。
浮点数溢出
当一个数的阶码大于机器数的最大阶码时,称为上溢;转溢出处理。当下溢时,视为机器零。
IEEE浮点数格式
IEEE标准规定浮点数的字长有3种:32位短实数,64位长实数和80位临时实数。因为尾数已经采用规格化方法表示,其最高位一定是有效数据位,因此可节省1位,这样表示的尾数有效位数可以再增加1位。规格户尾数最高数据位称隐藏位。
20位物理地址的计算方法
物理地址 = 段地址*16+偏移地址
通用寄存器
做16位使用,可以用AH、AL做8位寄存器使用。
AX称为累加器。它是算术运算的主要寄存器。所有的I/O指令都使用这个寄存器与外部设备传送信息。
BX称为基址寄存器。常用来存放存储器地址。
CX称为计数寄存器。在移位指令、循环指令和串处理指令中,CX用来保存计算值。
DX称为数据寄存器。一般在做双字长运算时,讲DX和AX组合在一起存放一个双字长数,DX用来存放高位字。某些I/O操作,DX可用来存放端口地址。
变址寄存器
变址寄存器包括源变址寄存器SI和目的变址寄存器DI。SI和DI可以像通用寄存器一样在运算过程中存放操作数,但它们只能以字(16位)为单位使用。 SI和DI一般与数据段寄存器DS联用,用来确定数据段中某个存储单元的地址。在串处理指令中,SI和DS联用,DI和ES联用,分别达到在数据段和附加 段中寻址的目的。
指针寄存器
BP寄存器
BP寄存器为基址指针寄存器。它可以像通用寄存器一样在运算过程中存放操作数,但只能以字为单位使用。BP可以与SS寄存器联用,确定堆栈段中的某个存储单元的地址。它可以作为堆栈区中的一个基地址,访问堆栈中的信息。
SP寄存器
SP寄存器为堆栈指针寄存器。它可以像通用寄存器一样在运算过程中存放操作数,但只能以字为单位使用。SP可以和SS联寄存器用,确定堆栈段中的某个存储单元的地址。SP用来指示栈顶的偏移地址。
IP寄存器
IP寄存器为指令指针寄存器。IP用来存放代码段中指令的偏移地址。在程序运行中,IP始终指向下一条指令的首地址,且与CS寄存器一起确定这条指令的物 理地址。IP内容的修改是自动完成的,即控制器取得一条执行的指令时马上修改IP的内容。因此IP寄存器用户程序是不能使用的。IP的内容在执行控制转移 指令、子程序调用指令和返回指令时讲被修改。
段寄存器
CS寄存器
CS寄存器用于存放当前执行的程序代码的所在段的段地址。CS的值乘以16(左移4位)再加上IP寄存器的值便可以确定下一条指令的存放地址。
DS寄存器
DS寄存器存当前数据段的段地址。
ES寄存器
ES寄存器用于存放附加段的段地址。ES通常是串处理中用来指定目的串所在段的段地址,此时DI寄存器存放目的串在段内的偏移地址。
SS寄存器用于存放堆栈段的段地址。
标志寄存器PSW
标志寄存器PSW是一个16为的寄存器。它反映了CPU运算的状态特征并且存放某些控制标志。8086使用了16位中的9位,包括6个状态标志位和3个控制标志位。
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
OF DF IF TF SF ZF AF PF CF
CF进位标志位:当执行一个加法(减法)运算时,最高位产生进位(或借位)时,CF为1,否则为0。
ZF零标志:若当前的运算结果为零,则ZF为1,否则为0。
SF符号标志位:该标志位与运算结果的最高位相同。即运算结果为负,则SF为1,否则为0。
OF溢出标志位:若运算结果超出机器能够表示的范围称为溢出,此时OF为1,否则为0。判断是否溢出的方法是:进行二进制运算时,最高位的进位值与次高位的进位值进行异或运算,若运算结果为1则表示溢出OF=1,否则OF=0
PF奇偶标志:当运算结果的最低8位中含1的个数为偶数则PF=1否则PF=0
AF辅助进位标志:一个加法(减法)运算结果的低4位向高4位有进位(或借位)时则AF=1否则AF=0
另外还有三个控制标志位用来控制CPU的操作,可以由程序进行置位和复位。
TF跟踪标志:该标志位为方面程序调试而设置。若TF=1,8086/8088CPU处于单步工作方式,即在每条指令执行结束后,产生中断。
IF中断标志位:该标志位用来控制CPU是否响应可屏蔽中断。若IF=1则允许中断,否则禁止中断。
DF方向标志:该标志位用来控制串处理指令的处理方向。若DF=1则串处理过程中地址自动递减,否则自动递增。
汇编环境
MASM.exe 汇编编译程序
LINK.exe 连接程序
LIB.exe 过程库管理程序
EDIT.exe DOS下的文本编辑,这个随便吧。。本人推荐notepad或者Emacs
DEBUG.exe 16位的指令调试器
.OBJ文件
生成的目标文件
.LST
列表文件同时列出源程序和机器语言程序清单。
.CRF
交叉文件。可用来生成交叉引用表REF。
MASM的使用
MASM [filename]
.MAP
连接映像文件。连接映像文件是连接程序的列表文件。
.LIB
库文件。
LINK的使用
LINK [filename]
DEBUG的使用
可以
debug filename
也可以使用NAME和LOAD导入需要调试的程序
-n filename
-l
-
查看反汇编的结果
-u
可以用-u来确定程序运行停止的地址,即断点地址。
若程序未完,再次使用u命令继续显示。
-u 偏移量
启动程序运行
-g 偏移量
查看数据段内容
-d 偏移量
单步跟踪
-t
执行一条指令后停下来,显示所有寄存器的内容及标志位的值
退出
-q
查看帮助信息
-h
- 破解/汇编学习笔记
- 汇编学习笔记(一)
- 汇编学习笔记(1)
- 汇编学习笔记~1
- 汇编学习笔记
- 汇编学习笔记
- ARM汇编学习笔记
- 汇编学习笔记
- 汇编学习笔记 (1)
- windows汇编学习笔记
- 汇编学习笔记【1】
- 汇编学习笔记【2】
- 汇编学习笔记【3】
- 汇编学习笔记1
- 汇编学习笔记1
- 汇编学习笔记一
- ARM汇编学习笔记
- 汇编学习笔记
- [坑向]sanae的ACM程序框架
- 对于框架的 pathinfo 的 nginx 配置
- 人生头2次面试的总结与反思
- 考试系统总结与下一步重构
- 汽车IQ成功了!
- 汇编学习笔记
- 你不可不知的Mango — 开发者篇(2)
- qtopia2.2.0编译成功,分享一下经验
- 关于Android系统中system.img和data.img中文件系统的权限设置
- Android 初始化脚本语法解析
- 如何让 Android 自动挂载 SD 卡
- Android(1.5) 开机图片/文字/动画 修改
- Android 调试.so库文件
- 如何分析 kernel panic