汇编学习(上)

一、机器语言简述

0和1组合而成
能被计算机直接识别
特点:速度快、可移植性差、难学难维护

二、汇编语言简述

  1. 以英文字、数字符号来描述机器语言,称为汇编语言
  2. 特定功能的符号指令称为指令,如ADD代表相加,MOV代表移动
  3. 负责翻译的工具称为编译器,汇编指令需要通过编译器转为机器指令
  4. 汇编语言是机器指令便于记忆的书写格式

三、计算机中的进制

一种逢几进一的运算

10B --二进制
10或10D --十进制
0x10或10H --十六进制

十进制转二进制方法:十进制数除2取余法,即十进制数除2,余数为权位上的数,得到的商继续除

在这里插入图片描述
二进制转十进制方法:把二进制数按权展开、相加即得十进制数,其实就是将每位的二进制数1或0乘以2^n
在这里插入图片描述
8个二进制数全为1,特点如下:
在这里插入图片描述
二进制转十六进制方法:4位二进制按权展开相加得到1位十六进制数,例如1111=F
注意:4位二进制转成十六进制是从右到左开始转换,不足时补0
在这里插入图片描述

四、存储器、CPU

计算机由五大部分组成:输入设备、控制器、运算器、存储器、输出设备

  • 存储器
    外部存储器如硬盘、光盘
    内部存取器如
    RAM(随机):内存条
    ROM(只读):BIOS芯片
    RAM和ROM区别在于断电之后内存中的东西是否会消失
  • CPU
    运算器
    控制器
    寄存器

计算机最小信息单位为bit(比特)
计算机存储数据的最小单位是Byte(字节)
8bit组成一个1B,也就是1字节
1024B=1KB
1024KB=1MB
1024MB=1GB
1024GB=1TB

存储器被划分成若干个存储单元,一个存储单元可以存储一个字节
每个存储单元由两部分构成:
一个是存储单元的地址,一般用十六进制表示;
一个是单存储元的内容,一般用十六进制表示。

CPU对存储器的读写:通过三种总线完成,分别为地址总线、数据总线、控制总线

地址总线
一个CPU有N根地址线,则可以说这个CPU的地址总线的宽度为N。这样的CPU最多可以寻找2
的N次方个内存单元(字节)
示例如下:
8080、8088、 8086、 80286、 80386是16根、20根、20根、24根、 32根,则他们的寻址能力分别为64KB,1MB,1MB, 16MB ,4GB。
2^ 16B=2^16/ 1024=64KB
2^ 20B=2^20/ 1024/ 1024=1M
2^ 24B=2^24/ 1024/ 1024=16M
数据总线
一根数据总线可以传输一个0或1,即1bit
示例如下:
8080、8088、 8086、80286、80386的数据总线宽度分别为8根、8根、16根、16根、32根。则它
们一次可以传送的数据为:1B,1B, 2B,2B,4B。

五、寄存器

  • 程序的简要运行流程
    1.程序加载到内存中
    2.CPU找到程序即将执行指令位置,并执行游戏程序
  • CPU如何找到程序即将执行指令位置?
    需要使用到寄存器(CS:IP) 寻址来确定即将执行指令位置
  • 什么是寄存器?
    寄存器是CPU内的组成部分。有限存贮容量的高速存贮部件,它们可用来暂存指令、数据和地址。
    一个二进制数=1位; 8位=1字节; 2字节=1字
    8086CPU含有14个寄存器,所有的寄存器都是16位的,可以存放两个字节,即存放一个字
    80386CPU含有16个寄存器,所有的寄存器都是32位的,可以存放四个字节,即存放两个字,
  • 16位CPU所含有的寄存器共14个
    4个数据寄存器(AX、BX、CX和DX)
    2个变址寄存器(SI和DI) 2个指针寄存器(SP和BP)
    4个段寄存器(ES、CS、SS、DS)
    1个指令指针寄存器(IP)1个标志寄存器(Flags)
    数据寄存器中的累加寄存器:
    16位CPU -AX
    32位CPU -EAX
    64位CPU -RAX
    其他寄存器同理32位加个E,64位加个R
  • 数据寄存器
    主要用来保存操作数和运算结果等信息,由AX,BX, CX,DX四个组成。
    由于在8086之前的CPU为8位CPU,为了兼容以前的8位程序,在8086CPU中,每一个数据寄存器都可以当做两个单独的寄存器来使用,由此,每一个16位寄存器可以当做2个独立的8位寄存器来使用。
    AX可以分为AH和AL ;
    BX可以分为BH和BL;
    CX可以分为CH和CL ;
    DX可以分为DH和DL;
    注意:除了上面4个数据寄存器以外,其他寄存器均不可以分为两个独立的8位寄存器。
    在这里插入图片描述
    注意:
    在16位CPU中,AX、BX、CX和DX不能存放存储单元的地址;
    在32位CPU中, 其32位寄存器EAX、EBX、ECX和EDX不仅可传送数据、暂存数据保存算术逻辑运算结果,而且也可作为指针寄存器所以,这些32位寄存器更具有通用性。
  • 32位CPU所含有的寄存器
    在这里插入图片描述
    这里的通用寄存器不管是16位还是32位都是有8个

六、CS:IP

注意:AL为低八位,值比如是F6,此时加上一个0A为100H,是9位的,则多了一位,需舍弃掉,保留00H,放入AL中。

物理地址=基础地址+偏移地址
基础地址=段地址x10H(即16)
物理地址=段地址x10H+偏移地址
CPU可以用不同的段地址和偏移地址形成同个物理地址

8086CPU有4个段寄存器:
CS:代码段寄存器(Code Segment)
DS:数据段寄存器(Data Segment)
SS:栈段寄存器(Stack Segment)
ES:附加段寄存器(Extra Segment)

8086机中,任意时刻,CPU将CS: IP指向的内容作为即将执行的指令。
CPU是由CS: IP中的内容决定执行命令
修改CS: IP方法:
1.同时修改CS: IP的内容
jmp段地址:偏移地址
例如:
jmp 2AE3:3 >从2AE33H处读取指令
jmp 3:0B16 >从00B46H处读取指令
2.修改IP的内容
jmp 某一合法寄存器
例如: jmp bx;
指令执行前: bx=0B16H, CS=2000H, IP=0003H
指令执行后: bx=0B16H, CS=2000H, IP=0B16H
jmp bx,在含义上好似: mov IP,bx

七、windows下汇编工具–debug使用

准备工具:DOSBox环境模拟器上与debug.exe
在这里插入图片描述
一、安装DOSBox0.74-win32-installer.exe

二、配置DOSBox操作目录:
1.在安装目录打开如下文件
在这里插入图片描述
2.在弹出配置选项文本文档,找到[autoexec]选项
3.在下面添加如下字段:
在这里插入图片描述
4.在d盘下创建masmpro目录
5.打开DOSBox
在这里插入图片描述
6.接下来输入C:
注:切换到C:目录下,此时输入dir可以看到D:masmpro里的文件
在这里插入图片描述
7.下面配置masmpro
将文件夹“工具a在DOSBOX下使用”内的内容拷贝到D:\ masmpro里
在这里插入图片描述
三、使用debug查看CPU、内存
debug简介:
debug是Dos、Windows提供的实模式( 8086方式)程序的调试工具。
debug功能:
可以查看CPU各种寄存器的内容
可以查看内存的情况
可以在机器码级别跟踪程序的运行
常用操作:
(1) R:查看更改cpu寄存器内容
(2) D:查看内存中内容
(3) E:改写内存中内容
(4)U:将内存中机器指令翻译成汇编指令
(5)T:执行一条机器指令
(6) A:以汇编格式在内存中写入一条指令
在这里插入图片描述

八、分段管理及标志寄存器

一个存储单元有一个物理地址,还有多个逻辑地址
物理地址:
1.就是一个存储单元的编号;
2.每个物理存储单元都有一个20位编号;
3.8086CPU物理地址范围: 00000H~FFFFFH
逻辑地址:
1.用户编程时,采用逻辑地址,形式为段基地址:段内偏移地址
2.物理地址:将逻辑地址左移4位,加上偏移地址就得到
20位物理地址
逻辑地址: 1230:100 1030:2100 1100:1400
物理地址: 12400 12400 12400
1230*10H + 100

8086CPU有4个段寄存器,每个段寄存器用来确定一个逻辑段的起始位置,每种逻辑段均有各自的用途:
1.CS (代码段) :指明代码的起始地址
利用CS: IP取得下一条要执行的指令
2.SS (堆栈段) :指明堆栈段的起始地址
利用SS: SP操作堆栈顶的数据
3.DS(数据段):指明数据的起始地址
利用DS: EA存取数据段中的数据
4.ES(附加段):指明附加段的起始地址
利用ES: EA存取附加段中的数据
注意:EA是偏移地址,称之为有效地址EA
若操作数在主存中,存取的方法有直接寻址方式、寄存器间接寻址方式、寄存器相对寻址方式、基址变址寻址方式、相对基址变址寻址方式

没有指明段前缀时,一般的数据访问在DS (数据)段
例如:
MOV AX,[1000H]; = MOV AX,DS:[1000H];
从默认的DS段中取出数据
MOV AX,CS:[1000H]
从指定的CS段取出数据

在这里插入图片描述
标志位:
1.状态标志:
用于记录程序运行结果的状态信息。
CF ZF SF PF OF AF
2.控制标志:
用于控制处理器执行指令。
DF IF TF

进位标志CF:
进位标志CF (Carry Flag),当运算结果的最高有效位有进位(加法)或借位(减法)时候,进位标志置1,即CF=1;否则CF=0

零标志ZF:
零标志ZF (Zero Flag),若运算结果为0,则ZF=1;否则ZF=0

符号标志SF:
符号标志SF (Sign Flag),若运算结果最高位为1,则SF=1; 否则SF=0
示例:
2C+ 7C= A8,二进制:100101000B
最高位为1:SF=1
39+C7=(1)00,二进制:(1 )00000000B
最高位为0: SF=0

奇偶标志PF:
奇偶标志PF (Parity Flag),若运算结果最低字节中“1”的个数为零或偶数时,则PF=1; 否则PF=0
示例:
2C + 7C= A8,二进制:10101000
结果中有3个1,是奇数: PF=0
39+C7=(1)00,二进制:(1 ) 00000000
结果中有0个1,是偶数:PF =1

溢出标志OF:
溢出标志OF (Overflow Flag),若运算结果有溢出,则OF=1;否则OF=0
溢出:如果运算结果超出了范围,就产生了溢出,有溢出,说明有符号数的运算结果不正确
说明:
我们通常认为溢出(上溢)就是因为进位时当前存储格式(1B、 2B、4B等)的位数(8bit、 16bit、32bit)不够而引起的。比如8位寄存器: 11111111B
+1B=100000000B超过了八位的1被认为是溢出寄存器(放不下),当然也是进位进上去的1

溢出与进位
溢出标志(OF) :表示有符号数运算结果是否超出范围,运算结果已经不正确
进位标志(CF) :表示有符号数运算结果是否超出范围,运算结果仍然正确
有符号无符号指的是最高位是否是符号位,即是以补码的形式看待还是以原码的形式看待。
CF范围: 0~255(8位)
OF范围: -128~ 127(8位)
(1)、8H+8H:
对于signed: (8)+(8)=16, 没超过[-128,127]的范围,OF为0
对于unsigned: (8)+(8)=16,没超过[0,255]的范围,CF为0
(2)、80H+81H:
对于signed: (-128)+(-127)= -255,超过[-128,127]的范围,OF为1
对于unsigned: (128)+(129)=257,超过[0,255]的范围, CF为1
(3)、FCH+05H:
对于signed: (-4)+(5)=1,没有超过[-128,127]的范围,OF为0
对于unsigned: (252)+(5)=257,超过[0,255]的范围,CF为1

辅助进位标志AF:
辅助进位标志AF ( Auxiliary Carry Flag),若运算时D₃(低半字节)有进位或借位时,AF=1; 否则AF=0
示例:
33H + 78H= ABH
低四位3,加上,低四位8,进位为零,即: AF=0.
39H+78H=B1H
低四位9,加上,低四位8,进位为1,即:AF=1。

方向标志DF:
方向标志DF ( Direction Flag)用于串操作指令中,控制地址的变化方向:
设置DF为0,存储器地址自动增加
设置DF为1,存储器地址自动减少
示例:
CLD指令用于复位方向标志,执行后DF=0;
STD指令用于置位方向标志,执行后DF=1。

中断允许标志IF:
中断允许标志IF ( Interrupt-enable Flag),用于控制外部可屏蔽中断是否可以被处理器响应:
设置IF为0,则禁止中断
设置IF为1,则允许中断
示例:
CLI指令用于复位中断标志,执行后IF=0;
STI指令用于置位中断标志,执行后IF=1。

陷阱标志TF:
陷阱标志TF (Trap Flag),用于控制处理器进入单步操作方式:
设置TF为0,处理器正常工作
设置TF为1,处理器单步执行指令
单步执行指令:处理器在每条指令执行结束时,便产生一个编号为1的内部中断
这种内部中断称为单步中断,所以TF也称单步标志;
利用单步中断可对程序进行逐条指令的调试;


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值