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架构下,串行处理和流水线处理是两种不同的指令处理方式。
-
串行处理: 串行处理是指在执行指令时,逐条顺序地执行指令。当一条指令执行完成后,才能开始执行下一条指令。这种处理方式的特点是简单直观,易于理解和调试,但效率相对较低。因为在串行处理中,指令之间存在时钟周期的间隔,导致CPU的运行效率受限。8086 CPU在早期的时候主要采用串行处理方式。
-
流水线处理: 流水线处理是指将指令处理过程划分为多个阶段,并在不同阶段同时执行不同的指令。每个阶段负责完成指定的任务,然后将结果传递给下一个阶段。这样可以实现多个指令的并行处理,提高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
相关文章:
16ASM 汇编基础与Debug使用
目录 硬件运行机制 微机系统硬件组成 计算机系统组成 8086CPU组织结构 DoxBox安装 Debug使用 R命令 D命令 E命令 U命令 T命令 A命令 标志寄存器 常用机器指令 硬件运行机制 下面是一个电子器件二极管,正向加电则通,反向加电则不通 利用二…...
基于Java车辆管理系统(如高校、办公园区)
基于Java车辆管理系统(如高校、办公园区) 功能需求 1、车辆进出管理:对进出校园和园区的车辆进行登记、授权和监管,确保车辆进出安全,特别是对于贵重车辆或特殊车辆,可以进行特别监控。 2、停车管理&…...
Dubbo v Spring Cloud:两大技术栈如何选型?
提到微服务开源框架,不可不说的是 Dubbo 和 Spring Cloud,这两大框架应该是大家最熟悉的微服务解决方案,也是面试中的热点。本文就梳理下 Dubbo 和 Spring Cloud 的应用特性,以及两个组件的功能对比。 Dubbo 应用 Dubbo 是阿里开…...
ubuntu上搭建bazel编译环境,构建Android APP
背景是github上下载的工程,说明仅支持bazel编译,折腾了一天Android studio,失败。 不得不尝试单价bazel编译环境,并不复杂,过程记录如下 说明:ubuntu环境是20.04,pve虚拟机安装 1.安装jdk sudo…...
(第38天)RAC 修改 IP 信息
介绍 在生产中有时候会遇到机房搬迁网络变更、系统上线由测试环境切换为生产环境、系统层面双网卡绑定或者解绑等情况。Oracle RAC 环境下应该如何操作?首先,我们都知道 Oracle RAC 中的 IP 主要有:Public IP、Virtual IP、SCAN IP、Private IP 这几种,接下来分别讲解这几…...
利用法线贴图渲染逼真的3D老虎模型
在线工具推荐: 3D数字孪生场景编辑器 - GLTF/GLB材质纹理编辑器 - 3D模型在线转换 - Three.js AI自动纹理开发包 - YOLO 虚幻合成数据生成器 - 三维模型预览图生成器 - 3D模型语义搜索引擎 当谈到游戏角色的3D模型风格时,有几种不同的风格…...
『 MySQL数据库 』聚合统计
文章目录 前言 🥑🥝 聚合函数🍓 COUNT( ) 查询数据数量🍓 SUM( ) 查询数据总和🍓 AVG( ) 查询数据平均值🍓 MAX( ) 查询数据最大值🍓 MIN( ) 查询数据最小值 🥝 数据分组GROUP BY子句…...
Redis - 事务隔离机制
Redis 的事务的本质是 一组命令的批处理 。这组命令在执行过程中会被顺序地、一次性 全部执行完毕,只要没有出现语法错误,这组命令在执行期间是不会被中断。 当事务中的命令出现语法错误时,整个事务在 exec 执行时会被取消。 如果事务中的…...
android项目实战之编辑器图片上传预览
现状分析 项目的需求用到编辑器,编辑器中又可能用到图片上传功能。 实现方案 1. 增加依赖库,可以参考前面的几篇文章,都有描述。 2. 核心代码实现 PictureSelector.create(GoodItemContentFragment.this) .openGallery(SelectMimeType.…...
微信小程序:上传图片到别的域名文件下
效果 wxml <!-- 上传照片 --> <view class"addbtn"><view classpic name"fault_photo" wx:for"{{imgs}}" wx:for-item"item" wx:key"*this"><image classweui-uploader_img src"{{item}}"…...
Linux----内核及发行版
1. Linux内核 Linux内核是操作系统内部操作和控制硬件设备的核心程序,它是由芬兰人林纳斯开发的。 内核效果图: 说明: 真正操作和控制硬件是由内核来完成的,操作系统是基于内核开发出来的。 2. Linux发行版 是Linux内核与各种常用软件的组合产品&am…...
设备制造行业CRM:提升客户满意度,驱动业务增长
设备制造行业客户需求多样化、服务链路长,企业在关注APS、EMS等工业软件之余还要以客户为中心,做好客户服务。设备制造行业CRM管理系统是企业管理客户关系的利器,设备制造行业CRM的作用有哪些?一文带您看懂。 设备制造行业需要解…...
JavaScript实现复制功能函数
function copyUrl() {var copyText document.getElementById("url");copyText.select();document.execCommand("copy"); }其中,copyUrl()函数用于复制,document.getElementById(“url”)用于获取链接的DOM元素,select()…...
JVM垃圾收集器
主要垃圾收集器如下,图中标出了它们的工作区域、垃圾收集算法,以及配合关系。 HotSpot虚拟机垃圾收集器 这些收集器里,面试的重点是两个——CMS和G1。 Serial 收集器 Serial(串行)收集器是最基本、历史最悠久的垃圾…...
LeetCode(58)随机链表的复制【链表】【中等】
目录 1.题目2.答案3.提交结果截图 链接: 随机链表的复制 1.题目 给你一个长度为 n 的链表,每个节点包含一个额外增加的随机指针 random ,该指针可以指向链表中的任何节点或空节点。 构造这个链表的 深拷贝。 深拷贝应该正好由 n 个 全新 节…...
JVM源码剖析之registerNatives方法
目录 版本信息: 写在前面: 源码论证: 总结: 版本信息: jdk版本:jdk8u40 写在前面: 在Java类库中很多类都有一个registerNatives的native方法,并且写在static静态代码块中进行初…...
HarmonyOS鸿蒙应用开发——数据持久化Preferences
文章目录 数据持久化简述基本使用与封装测试用例参考 数据持久化简述 数据持久化就是将内存数据通过文件或者数据库的方式保存到设备中。HarmonyOS提供两两种持久化方案: Preferences:主要用于保存一些配置信息,是通过文本的形式存储的&…...
C++STL库的 deque、stack、queue、list、set/multiset、map/multimap
deque 容器 Vector 容器是单向开口的连续内存空间, deque 则是一种双向开口的连续线性空 间。所谓的双向开口,意思是可以在头尾两端分别做元素的插入和删除操作,当然, vector 容器也可以在头尾两端插入元素,但是在其…...
Vuex快速上手
一、Vuex 概述 目标:明确Vuex是什么,应用场景以及优势 1.是什么 Vuex 是一个 Vue 的 状态管理工具,状态就是数据。 大白话:Vuex 是一个插件,可以帮我们管理 Vue 通用的数据 (多组件共享的数据)。例如:购…...
计网 - LVS 是如何直接基于 IP 层进行负载平衡调度
文章目录 模型LVS的工作机制初探LVS的负载均衡机制初探 模型 大致来说,可以这么理解(只是帮助我们理解,实际上肯定会有点出入),对于我们的 PC 机来说,物理层可以看成网卡,数据链路层可以看成网卡…...
XML Group端口详解
在XML数据映射过程中,经常需要对数据进行分组聚合操作。例如,当处理包含多个物料明细的XML文件时,可能需要将相同物料号的明细归为一组,或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码,增加了开…...
React Native 导航系统实战(React Navigation)
导航系统实战(React Navigation) React Navigation 是 React Native 应用中最常用的导航库之一,它提供了多种导航模式,如堆栈导航(Stack Navigator)、标签导航(Tab Navigator)和抽屉…...
测试markdown--肇兴
day1: 1、去程:7:04 --11:32高铁 高铁右转上售票大厅2楼,穿过候车厅下一楼,上大巴车 ¥10/人 **2、到达:**12点多到达寨子,买门票,美团/抖音:¥78人 3、中饭&a…...
Java 加密常用的各种算法及其选择
在数字化时代,数据安全至关重要,Java 作为广泛应用的编程语言,提供了丰富的加密算法来保障数据的保密性、完整性和真实性。了解这些常用加密算法及其适用场景,有助于开发者在不同的业务需求中做出正确的选择。 一、对称加密算法…...
Android15默认授权浮窗权限
我们经常有那种需求,客户需要定制的apk集成在ROM中,并且默认授予其【显示在其他应用的上层】权限,也就是我们常说的浮窗权限,那么我们就可以通过以下方法在wms、ams等系统服务的systemReady()方法中调用即可实现预置应用默认授权浮…...
Mobile ALOHA全身模仿学习
一、题目 Mobile ALOHA:通过低成本全身远程操作学习双手移动操作 传统模仿学习(Imitation Learning)缺点:聚焦与桌面操作,缺乏通用任务所需的移动性和灵活性 本论文优点:(1)在ALOHA…...
云原生玩法三问:构建自定义开发环境
云原生玩法三问:构建自定义开发环境 引言 临时运维一个古董项目,无文档,无环境,无交接人,俗称三无。 运行设备的环境老,本地环境版本高,ssh不过去。正好最近对 腾讯出品的云原生 cnb 感兴趣&…...
高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数
高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数 在软件开发中,单例模式(Singleton Pattern)是一种常见的设计模式,确保一个类仅有一个实例,并提供一个全局访问点。在多线程环境下,实现单例模式时需要注意线程安全问题,以防止多个线程同时创建实例,导致…...
云原生安全实战:API网关Kong的鉴权与限流详解
🔥「炎码工坊」技术弹药已装填! 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 一、基础概念 1. API网关(API Gateway) API网关是微服务架构中的核心组件,负责统一管理所有API的流量入口。它像一座…...
GitHub 趋势日报 (2025年06月06日)
📊 由 TrendForge 系统生成 | 🌐 https://trendforge.devlive.org/ 🌐 本日报中的项目描述已自动翻译为中文 📈 今日获星趋势图 今日获星趋势图 590 cognee 551 onlook 399 project-based-learning 348 build-your-own-x 320 ne…...




