16ASM 汇编基础与Debug使用

目录

硬件运行机制

微机系统硬件组成

计算机系统组成

8086CPU组织结构

DoxBox安装

Debug使用

R命令

D命令

E命令

U命令

T命令

A命令

标志寄存器

常用机器指令


硬件运行机制

下面是一个电子器件二极管,正向加电则通,反向加电则不通

利用二极管的这个特性可以得到下面的门电路,这些电路可以进行与、或、非运算

在计算机底层,加减乘除的运算就是有这三种运算构成的

所有的数学运算都可以由位运算组成。那么更高级的数学运算也可以通过简单的位运算计算。所以将常用运算封装成一个器件,称之为单元。

用法

机器码:类似111111000010101010B,可以用来控制硬件的二进制数据,叫做机器码。

助记符:二进制值难记,每种功能的二进制控制码取一个容易记住的名字,叫做助记符,也称之为指令 例如,00B - add            01B - sub            10B - xor

汇编:助记符硬件不能识别,需要将其转换成对应的机器码,这个过程叫做汇编。

微机系统硬件组成

一个系统不可能由一个硬件单独完成,所以划分出多个硬件模块, 然后由一个硬件模块居中调度,称作cpu(centeral processing unit)。

单片机系统实物

IO桥:所有的硬件模块连接到I/O桥,由I/O桥负责辅助cpu与哪一个硬件模块连接。

总线:cpu有8位数据/地址线,ram是个256byte的存储器。

计算机系统组成

计算机分层示意图

程序 hello.c 到可执行文件

加载可执行文件

执行

8086CPU组织结构

8086CPU架构如下图:

EU部件:1. 执行部件(excution unit) 2. 译码    3. 执行指令

BIU部件:1. 总线接口部件(bus interface unit) 2. 取指令     3. 读取数据       4. 写入数据

寄存器

流水线处理

问题:8086cpu将指令的执行分成多个模块,有什么好处?

答案:流水线,可以多个部件同时工作,提高硬件的利用率,从而提高效率。

在8086 CPU架构下,串行处理和流水线处理是两种不同的指令处理方式。

  1. 串行处理: 串行处理是指在执行指令时,逐条顺序地执行指令。当一条指令执行完成后,才能开始执行下一条指令。这种处理方式的特点是简单直观,易于理解和调试,但效率相对较低。因为在串行处理中,指令之间存在时钟周期的间隔,导致CPU的运行效率受限。8086 CPU在早期的时候主要采用串行处理方式。

  2. 流水线处理: 流水线处理是指将指令处理过程划分为多个阶段,并在不同阶段同时执行不同的指令。每个阶段负责完成指定的任务,然后将结果传递给下一个阶段。这样可以实现多个指令的并行处理,提高CPU的执行效率。流水线处理利用了指令的部分并行性,有效地利用了CPU资源。8086 CPU在后期引入了流水线处理的技术,提高了指令的执行速度。

在8086 CPU中,流水线处理主要包括以下几个阶段:

  • 取指令阶段(Instruction Fetch):从内存中读取指令,并将其存储在指令缓存中。
  • 译码阶段(Instruction Decode):对取得的指令进行解码,确定指令的操作类型和操作数。
  • 执行阶段(Execution):根据指令的类型执行相应的操作,比如算术运算、逻辑运算等。
  • 存储阶段(Memory Access):若指令需要访问内存或外设,则在此阶段进行数据的读取或写入。
  • 写回阶段(Write Back):将执行结果写回寄存器或内存。

效率:流水线处理 > 串行处理

弊端:当跳转到总线使用的时候,此时已经取得一部分指令,并且已经译码了。那么此时这部分将清空,从头操作。类似于goto语句。

DoxBox安装

运行安装程序后一路Next即可,安装完成

dosbox是个模拟器,并没有计算机的磁盘信息,需要访问磁盘的办法是将 虚拟机磁盘映射到物理机磁盘

dosbox安装目录:双击DOSBox 0.74 Options.bat文件,弹出配置信息,在最后末尾行加上如下:

mount C D:\debug\MASM
mount D D:\debug\Test
set path=C:
d:

把DOSBOX的C盘挂载到D:\debug\MASM,D盘挂载到D:\debug\Test,并设置全局变量

D:\debug\MASM下载以下工具:

D:\debug\Test是工作目录, 新建一个记事本,命名为hello.txt,将下面的程序复制进去,并保存

;80x86<new>
DSEG    SEGMENT
MESS    DB      'Hello,World!',0DH,0AH,24H
DSEG    ENDSSSEG    SEGMENT PARA STACKDW  256 DUP(?)
SSEG    ENDSCSEG    SEGMENTASSUME  CS:CSEG,DS:DSEG
BEGIN:  MOV AX,DSEGMOV DS,AXMOV DX,OFFSET MESSMOV AH,9INT 21HMOV AH,4CHINT 21H
CSEG    ENDSEND  BEGIN

编译:masm hello.asm

链接: link hello.obj

运行: hello.exe 

在执行时会得到一些中间产物的文件

  • .obj(Object File):这是编译器生成的目标文件,包含了汇编程序的机器码和相关符号信息。目标文件是可重定位的,即可以与其他目标文件链接以生成可执行文件。
  • .lst(Listing File):这是汇编程序的汇编列表文件,包含了源代码和对应的汇编和机器码指令的对应关系。列表文件通常用于调试和分析程序,可以了解每条指令的地址、十六进制表示以及与源代码的对应关系。
  • .map(Map File):这是一个链接器生成的映射文件,记录了程序的内存布局、符号表、段地址等信息。映射文件可以帮助程序员了解程序的内存使用情况和地址分配情况。
  • .pdb(Program Database File):这是调试信息数据库文件,包含了与源代码对应的调试信息,用于在调试器中进行源代码级别的调试。.pdb文件通常与可执行文件一起使用。

基本DOS命令

#cd\ ——首先要用cd\ 退回到根目录C>下
#dir ——显示文件列表
#md hb ——建立hb子目录
#cd hb ——进入hb子目录
#copy d:\dos\masm.exe c:\hb ——将D盘dos目录下的masm.exe拷贝到C盘hb目录下
#copy d:\dos\link.exe c:\hb ——将D盘dos目录下的link.exe拷贝到C盘hb目录下
#cd .. ——退回到上一级目录
#del \hb\masm.exe ——删除hb子目录中的某文件
#rd hb ——删除hb子目录(子目录中的所有文件必须先删除)
#e:——进入e盘
#cls ——清屏
#type——显示文本文件内容(如type c:\hb\abc.asm)

Debug使用

debug是微软公司出品的调试工具,非常好用,可以调试0环和3环,目前市面上的大多数只能调试3环,虽然好用,但是由于界面和操作环境的原因,所以用的人不多。

作用:深入机器内部观察,修改观察寄存器等值的内容。

Debug基本功能:

  • R命令:查看、改变CPU寄存器的内容
  • D命令:查看内存中的内容
  • E命令:改写内存中的内容
  • U命令:将内存中的机器指令翻译成汇编指令
  • T命令:执行一条机器指令
  • A命令:以汇编指令的格式在内存中写入一条机器指令
  • Q命令:退出

R命令

查看CPU寄存器的内容【R】

修改寄存器中的值【R 寄存器】

D命令

查看内存中的内容【D 段地址:偏移地址】

指定范围查看内存中的内容【D 段地址:起始偏移地址 结尾偏移地址】

D命令输出内容可以分为三部分:

左侧为每行的内存单元起始地址

中间为128个内存单元的内容,用十六进制的格式输出

右侧为每个内存单元中的数据对应的可显示的ASCII码字符

使用“d 段地址:偏移地址”格式的D命令,Debug会列出从指定内存单元开始的128个内存单元的内容

再使用“d 段地址:偏移地址”之后,接着使用D命令,可列出后续的内容

使用“d 段地址:起始偏移地址 结尾偏移地址”格式可指定范围来查看内存中的内容

E命令

修改内存中的内容【E 段地址:偏移地址】

一次性修改多个内存中的内容【E 段地址:偏移地址 值1 值2 ......】

值1是字符或字符串时,会自动转成ASCII码

“E 段地址:偏移地址”格式,Debug会以提问的方式来逐个修改从此地址开始的内存单元中的内容

Debug显示10000H处的原内容11,可以在“.”后输入新内容(结束按Enter,继续修改下一个单元内容按Space)

可使用【E 段地址:偏移地址 值1 值2 ......】来一次性修改多个内存中的内容

U命令

将内存中的机器指令翻译成汇编指令【U 段地址:偏移地址】

U命令的显示输出分为三部分:

  • 左侧为机器指令的地址
  • 中间为机器指令
  • 右侧为机器指令所对应的汇编指令

T命令

执行一条或多条指令【T】

执行的命令为CS:IP指向的指令

执行T命令后,CPU执行CS:IP指向的指令,指令执行后,Debug显示输出CPU寄存器的状态

A命令

以汇编指令的形式在内存写入机器指令【A 段地址:偏移地址】

Debug会将这些汇编指令翻译成对应的机器指令,将它们的机器码写入内存,在给出的起始地址后面直接按Enter键表示操作结束

标志寄存器

条件标志:

  • CF 进位标志:用于反映运算是否产生进位或借位。如果运算结果的最高位产生一个进位或借位,则CF置1,否则置0。运算结果的最高位包括字操作的第15位和字节操作的第7位。移位指令也会将操作数的最高位或最低位移入CF。
  • PF 奇偶标志:用于反映运算结果低8位中“1”的个数。“1”的个数为偶数,则PF置1,否则置0。
  • AF 辅助进位标志算数操作结果的第三位(从0开始计数)如果产生了进位或者借位则将其置为1,否则置为0,常在BCD(binary-codedecimal)算术运算中被使用。
  • ZF 零标志:用于判断结果是否为0。运算结果0,ZF置1,否则置0。
  • SF 符号标志:用于反映运算结果的符号,运算结果为负,SF置1,否则置0。因为有符号数采用补码的形式表示,所以SF与运算结果的最高位相同。
  • OF 溢出标志:反映有符号数加减运算是否溢出。如果运算结果超过了8位或者16位有符号数的表示范围,则OF置1,否则置0。

控制标志:

  • TF 跟踪标志:当TF被设置为1时,CPU进入单步模式,所谓单步模式就是CPU在每执行一步指令后都产生一个单步中断。主要用于程序的调试。8086/8088中没有专门用来置位和清零TF的命令,需要用其他办法。
  • IF 中断标志:决定CPU是否响应外部可屏蔽中断请求。IF为1时,CPU允许响应外部的可屏蔽中断请求。
  • DF 方向标志:决定串操作指令执行时有关指针寄存器调整方向。当DF为1时,串操作指令按递减方式改变有关存储器指针值,每次操作后使SI、DI递减。

在(cmd debug)调试程序中为了使标志位的值显尔易见,他提供用符号表示标志位的值:

注意:

  • 进位针对的是无符号数运算,溢出针对的是有符号数运算。
  • 当看成无符号数,则关注CF标志,看成有符号数,则关注OF标志。

常用机器指令

mov reg, reg
mov reg, imm;(立即数,常数)
mov ax, 5566
mov al, 78add reg1,reg2 两个值相加,值存入第一个值里
add ax,bx;	ax = ax + bx
add ax,123; ax = ax + 1234
add 123,ax 	123 = 123 + ax ;  Errorsub 与之相反
 cmp ax,bx 如果(ax)=(bx), 则 zf=1 如果(ax)!=(bx), 则 zf=0 如果(ax)<(bx), 则 cf=1 如果(ax)>=(bx), 则 cf=0 如果(ax)>(bx), 则 cf=0且zf=0 如果(ax)<=(bx), 则 cf=1或zf=1 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/217685.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

西南交通大学【数据结构实验8】

实验内容及要求&#xff1a; 编写控制台应用程序&#xff0c;提供以下菜单项&#xff1a; 插入元素 从键盘输入若干两两互不相同的非0整数&#xff0c;直到输入0时停止。将输入的所有非0整数按输入次序插入二叉排序树(初始时是空树)。 插入某个非0整数时&#xff0c;若该整…

不需要联网的ocr项目

地址 GitHub - plantree/ocr-pwa: A simple PWA for OCR, based on Tesseract. 协议 mit 界面 推荐理由 可以离线使用&#xff0c;隐私安全

JAVA全栈开发 JDBC、反射、设计者模式

一、JDBC 【1】JDBC概述 1.1什么是jdbc Java DataBase Connectivity是一种用于执行SQL语句的Java API&#xff0c;它由一组用Java语言编写的类和接口组成。通过这些类和接口&#xff0c;JDBC把SQL语句发送给不同类型的数据库进行处理并接收处理结果。 1.2jdbc的作用 提供j…

深度探索Linux操作系统 —— 构建桌面环境

系列文章目录 深度探索Linux操作系统 —— 编译过程分析 深度探索Linux操作系统 —— 构建工具链 深度探索Linux操作系统 —— 构建内核 深度探索Linux操作系统 —— 构建initramfs 深度探索Linux操作系统 —— 从内核空间到用户空间 深度探索Linux操作系统 —— 构建根文件系统…

Quartus II + Modelsim 脚本仿真

软件版本&#xff1a;Intel Quartus Prime Design Suite: 23.2 方式参考附件Intel 官方文档&#xff1a;Questa*-Intel FPGA Edition Quick-Start: Intel Quartus Prime Pro Edition 第1步&#xff0c;创建一个ram ip&#xff0c;并形成一个例化的top层ip 第2步&#xff0c;自…

免费图片无损放大:8大平台突破画质极限

之前介绍过图片提高清晰度的工具平台&#xff0c;这次AIGCer介绍下将图片无损放大的几个在线免费的工具平台。图片高清放大是一种处理低分辨率图像的方法&#xff0c;以增加图像的尺寸和细节&#xff0c;使其看起来更大、更清晰。 1.美图设计室 传送门&#xff1a;https://ww…

基于Python+WaveNet+MFCC+Tensorflow智能方言分类—深度学习算法应用(含全部工程源码)(二)

目录 前言引言总体设计系统整体结构图系统流程图 运行环境模块实现1. 数据预处理1&#xff09;数据介绍2&#xff09;数据测试3&#xff09;数据处理 相关其它博客工程源代码下载其它资料下载 前言 博主前段时间发布了一篇有关方言识别和分类模型训练的博客&#xff0c;在读者…

什么是Z-Wave,技术特点,各国支持的频段

1.1 背景 Z-Wave是一种无线通信的协议&#xff0c;主要应用于智能家居网络&#xff0c;而其Z-Wave联盟主要是推动家庭自动化领域采用Z-Wave协议&#xff0c;其联盟成员都是智能家居领域非常有名的厂商&#xff0c;基本上覆盖了全球。 2.1 技术特点 低功耗、高可…

BigDecimald简单使用

为什么要用BigDecimal运算 在计算浮点型数据时,往往会存在数据计算失真问题 例1 2.0 - 1.9 应该等于0.1,用float类型赋值运算得出的结果为0.100000024,有问题 例2 1.8 - 1.9 应该等于 -0.1,用double类型赋值得出的结果为-0.09999999999999987,明显有问题 BigDecimal使用 BigDec…

用23种设计模式打造一个cocos creator的游戏框架----(十四)观察者模式

1、模式标准 模式名称&#xff1a;观察者模式 模式分类&#xff1a;行为型 模式意图&#xff1a;定义对象间的一种一对多的依赖关系&#xff0c;当一个对象的状态发生改变时&#xff0c;所有依赖于它的对象都得到通知并被自动更新。 结构图&#xff1a; 适用于&#xff1a;…

网神 SecGate 3600 防火墙 多处任意文件上传漏洞复现

0x01 产品简介 网神SecGate 3600防火墙是基于状态检测包过滤和应用级代理的复合型硬件防火墙,是专门面向大中型企业、政府、军队、高校等用户开发的新一代专业防火墙设备,支持外部攻击防范、内网安全、网络访问权限控制、网络流量监控和带宽管理、动态路由、网页内容过滤、邮…

【Jeecg Boot 3 - 第二天】1.2、jar 包和 lib 依赖分离,部署包缩小100倍

一、场景 二、思路 三、实战 ▶ 2.1、项目 jar 包解压获取 lib config Stage 1&#xff1a;正常打包获取 jeecg-system-start-3.6.0.jar Stage 2&#xff1a;解压 获取如下文件 Stage 3&#xff1a;获取 lib config ▶ 2.2、获取简化版项目jar包 Stage 1&#xff1…

AI+无代码助力企业供应链优化

内容来自演讲&#xff1a;潘峰 | 预见明日科技&#xff08;北京&#xff09;有限公司 | CEO 摘要 本文介绍了企业供应链中的挑战和解决方案。文章指出&#xff0c;供应链成本占企业经营成本的大部分&#xff0c;且存在供给端和需求端的高度不确定性。为应对这种不确定性&…

【深度学习】注意力机制(二)

本文介绍一些注意力机制的实现&#xff0c;包括EA/MHSA/SK/DA/EPSA。 【深度学习】注意力机制&#xff08;一&#xff09; 【深度学习】注意力机制&#xff08;三&#xff09; 目录 一、EA&#xff08;External Attention&#xff09; 二、Multi Head Self Attention 三、…

ActiveMQ任意文件写入漏洞(CVE-2016-3088)

简述&#xff1a;ActiveMQ的fileserver支持写入文件(但是不支持解析jsp),同时也支持移动文件。所以我们只需要先上传到服务器&#xff0c;然后再移动到可以解析的地方即可造成任意文件写入漏洞。我们可以利用这个漏洞来上传webshell或者上传定时任务文件。 漏洞复现 启动环境 …

stm32 HAL库 发送接受 到了一定的字符串后就卡在.s文件中

问题介绍&#xff1a; 某个项目开发过程中&#xff0c;串口接收中断&#xff0c;开启了DMA数据传输&#xff0c;开启了DMA中断&#xff0c;开启DMA半满中断。然后程序运行的过程中&#xff0c;接收了一部分数据后就会卡在启动文件的DMA1_Ch4_7_DMA2_Ch3_5_IRQHandler 中断里。…

Etcd实战(二)-k8s集群中Etcd数据存储

1 介绍 k8s中所有对象的manifest都需要保存到某个地方&#xff0c;这样他们的manifest在api server重启和失败的时候才不会丢失&#xff0c;因此引入了etcd。在k8s中只有api server和etcd直接交互&#xff0c;其它组件都通过api server间接和etcd交互&#xff0c;这样做的好处…

Flink反压如何查看和优化

我们在使用Flink程序进行流式数据处理时&#xff0c;由于种种原因难免会遇到性能问题&#xff0c;如我们在使用Flink程序消费kafka数据&#xff0c;可能会遇到kafka数据有堆积的情况&#xff0c;并且随着时间的推移&#xff0c;数据堆积越来越多&#xff0c;这就表名消费处理数…

机器学习---Boosting

1. Boosting算法 Boosting思想源于三个臭皮匠&#xff0c;胜过诸葛亮。找到许多粗略的经验法则比找到一个单一的、高度预 测的规则要容易得多&#xff0c;也更有效。 预测明天是晴是雨&#xff1f;传统观念&#xff1a;依赖于专家系统&#xff08;A perfect Expert) 以“人无…

云基础软件深化合作,云轴科技ZStack与麒麟软件战略签约

12月8日&#xff0c;云轴科技ZStack与麒麟软件战略合作签约仪式在北京举行&#xff0c;双方对过往紧密合作表达了充分肯定&#xff0c;并就进一步联合技术创新、打造重点行业标杆和持续赋能客户达成高度共识。云轴科技创始人&CEO张鑫和麒麟软件高级副总经理谢文征共同见证双…