当前位置: 首页 > news >正文

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 

相关文章:

16ASM 汇编基础与Debug使用

目录 硬件运行机制 微机系统硬件组成 计算机系统组成 8086CPU组织结构 DoxBox安装 Debug使用 R命令 D命令 E命令 U命令 T命令 A命令 标志寄存器 常用机器指令 硬件运行机制 下面是一个电子器件二极管&#xff0c;正向加电则通&#xff0c;反向加电则不通 利用二…...

基于Java车辆管理系统(如高校、办公园区)

基于Java车辆管理系统&#xff08;如高校、办公园区&#xff09; 功能需求 1、车辆进出管理&#xff1a;对进出校园和园区的车辆进行登记、授权和监管&#xff0c;确保车辆进出安全&#xff0c;特别是对于贵重车辆或特殊车辆&#xff0c;可以进行特别监控。 2、停车管理&…...

Dubbo v Spring Cloud:两大技术栈如何选型?

提到微服务开源框架&#xff0c;不可不说的是 Dubbo 和 Spring Cloud&#xff0c;这两大框架应该是大家最熟悉的微服务解决方案&#xff0c;也是面试中的热点。本文就梳理下 Dubbo 和 Spring Cloud 的应用特性&#xff0c;以及两个组件的功能对比。 Dubbo 应用 Dubbo 是阿里开…...

ubuntu上搭建bazel编译环境,构建Android APP

背景是github上下载的工程&#xff0c;说明仅支持bazel编译&#xff0c;折腾了一天Android studio&#xff0c;失败。 不得不尝试单价bazel编译环境&#xff0c;并不复杂&#xff0c;过程记录如下 说明&#xff1a;ubuntu环境是20.04&#xff0c;pve虚拟机安装 1.安装jdk sudo…...

(第38天)RAC 修改 IP 信息

介绍 在生产中有时候会遇到机房搬迁网络变更、系统上线由测试环境切换为生产环境、系统层面双网卡绑定或者解绑等情况。Oracle RAC 环境下应该如何操作?首先,我们都知道 Oracle RAC 中的 IP 主要有:Public IP、Virtual IP、SCAN IP、Private IP 这几种,接下来分别讲解这几…...

利用法线贴图渲染逼真的3D老虎模型

在线工具推荐&#xff1a; 3D数字孪生场景编辑器 - GLTF/GLB材质纹理编辑器 - 3D模型在线转换 - Three.js AI自动纹理开发包 - YOLO 虚幻合成数据生成器 - 三维模型预览图生成器 - 3D模型语义搜索引擎 当谈到游戏角色的3D模型风格时&#xff0c;有几种不同的风格&#xf…...

『 MySQL数据库 』聚合统计

文章目录 前言 &#x1f951;&#x1f95d; 聚合函数&#x1f353; COUNT( ) 查询数据数量&#x1f353; SUM( ) 查询数据总和&#x1f353; AVG( ) 查询数据平均值&#x1f353; MAX( ) 查询数据最大值&#x1f353; MIN( ) 查询数据最小值 &#x1f95d; 数据分组GROUP BY子句…...

Redis - 事务隔离机制

Redis 的事务的本质是 一组命令的批处理 。这组命令在执行过程中会被顺序地、一次性 全部执行完毕&#xff0c;只要没有出现语法错误&#xff0c;这组命令在执行期间是不会被中断。 当事务中的命令出现语法错误时&#xff0c;整个事务在 exec 执行时会被取消。 如果事务中的…...

android项目实战之编辑器图片上传预览

现状分析 项目的需求用到编辑器&#xff0c;编辑器中又可能用到图片上传功能。 实现方案 1. 增加依赖库&#xff0c;可以参考前面的几篇文章&#xff0c;都有描述。 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内核是操作系统内部操作和控制硬件设备的核心程序&#xff0c;它是由芬兰人林纳斯开发的。 内核效果图: 说明: 真正操作和控制硬件是由内核来完成的&#xff0c;操作系统是基于内核开发出来的。 2. Linux发行版 是Linux内核与各种常用软件的组合产品&am…...

设备制造行业CRM:提升客户满意度,驱动业务增长

设备制造行业客户需求多样化、服务链路长&#xff0c;企业在关注APS、EMS等工业软件之余还要以客户为中心&#xff0c;做好客户服务。设备制造行业CRM管理系统是企业管理客户关系的利器&#xff0c;设备制造行业CRM的作用有哪些&#xff1f;一文带您看懂。 设备制造行业需要解…...

JavaScript实现复制功能函数

function copyUrl() {var copyText document.getElementById("url");copyText.select();document.execCommand("copy"); }其中&#xff0c;copyUrl()函数用于复制&#xff0c;document.getElementById(“url”)用于获取链接的DOM元素&#xff0c;select()…...

JVM垃圾收集器

主要垃圾收集器如下&#xff0c;图中标出了它们的工作区域、垃圾收集算法&#xff0c;以及配合关系。 HotSpot虚拟机垃圾收集器 这些收集器里&#xff0c;面试的重点是两个——CMS和G1。 Serial 收集器 Serial&#xff08;串行&#xff09;收集器是最基本、历史最悠久的垃圾…...

LeetCode(58)随机链表的复制【链表】【中等】

目录 1.题目2.答案3.提交结果截图 链接&#xff1a; 随机链表的复制 1.题目 给你一个长度为 n 的链表&#xff0c;每个节点包含一个额外增加的随机指针 random &#xff0c;该指针可以指向链表中的任何节点或空节点。 构造这个链表的 深拷贝。 深拷贝应该正好由 n 个 全新 节…...

JVM源码剖析之registerNatives方法

目录 版本信息&#xff1a; 写在前面&#xff1a; 源码论证&#xff1a; 总结&#xff1a; 版本信息&#xff1a; jdk版本&#xff1a;jdk8u40 写在前面&#xff1a; 在Java类库中很多类都有一个registerNatives的native方法&#xff0c;并且写在static静态代码块中进行初…...

HarmonyOS鸿蒙应用开发——数据持久化Preferences

文章目录 数据持久化简述基本使用与封装测试用例参考 数据持久化简述 数据持久化就是将内存数据通过文件或者数据库的方式保存到设备中。HarmonyOS提供两两种持久化方案&#xff1a; Preferences&#xff1a;主要用于保存一些配置信息&#xff0c;是通过文本的形式存储的&…...

C++STL库的 deque、stack、queue、list、set/multiset、map/multimap

deque 容器 Vector 容器是单向开口的连续内存空间&#xff0c; deque 则是一种双向开口的连续线性空 间。所谓的双向开口&#xff0c;意思是可以在头尾两端分别做元素的插入和删除操作&#xff0c;当然&#xff0c; vector 容器也可以在头尾两端插入元素&#xff0c;但是在其…...

Vuex快速上手

一、Vuex 概述 目标&#xff1a;明确Vuex是什么&#xff0c;应用场景以及优势 1.是什么 Vuex 是一个 Vue 的 状态管理工具&#xff0c;状态就是数据。 大白话&#xff1a;Vuex 是一个插件&#xff0c;可以帮我们管理 Vue 通用的数据 (多组件共享的数据)。例如&#xff1a;购…...

计网 - LVS 是如何直接基于 IP 层进行负载平衡调度

文章目录 模型LVS的工作机制初探LVS的负载均衡机制初探 模型 大致来说&#xff0c;可以这么理解&#xff08;只是帮助我们理解&#xff0c;实际上肯定会有点出入&#xff09;&#xff0c;对于我们的 PC 机来说&#xff0c;物理层可以看成网卡&#xff0c;数据链路层可以看成网卡…...

从WWDC看苹果产品发展的规律

WWDC 是苹果公司一年一度面向全球开发者的盛会&#xff0c;其主题演讲展现了苹果在产品设计、技术路线、用户体验和生态系统构建上的核心理念与演进脉络。我们借助 ChatGPT Deep Research 工具&#xff0c;对过去十年 WWDC 主题演讲内容进行了系统化分析&#xff0c;形成了这份…...

【WiFi帧结构】

文章目录 帧结构MAC头部管理帧 帧结构 Wi-Fi的帧分为三部分组成&#xff1a;MAC头部frame bodyFCS&#xff0c;其中MAC是固定格式的&#xff0c;frame body是可变长度。 MAC头部有frame control&#xff0c;duration&#xff0c;address1&#xff0c;address2&#xff0c;addre…...

Linux相关概念和易错知识点(42)(TCP的连接管理、可靠性、面临复杂网络的处理)

目录 1.TCP的连接管理机制&#xff08;1&#xff09;三次握手①握手过程②对握手过程的理解 &#xff08;2&#xff09;四次挥手&#xff08;3&#xff09;握手和挥手的触发&#xff08;4&#xff09;状态切换①挥手过程中状态的切换②握手过程中状态的切换 2.TCP的可靠性&…...

蓝桥杯 2024 15届国赛 A组 儿童节快乐

P10576 [蓝桥杯 2024 国 A] 儿童节快乐 题目描述 五彩斑斓的气球在蓝天下悠然飘荡&#xff0c;轻快的音乐在耳边持续回荡&#xff0c;小朋友们手牵着手一同畅快欢笑。在这样一片安乐祥和的氛围下&#xff0c;六一来了。 今天是六一儿童节&#xff0c;小蓝老师为了让大家在节…...

Leetcode 3577. Count the Number of Computer Unlocking Permutations

Leetcode 3577. Count the Number of Computer Unlocking Permutations 1. 解题思路2. 代码实现 题目链接&#xff1a;3577. Count the Number of Computer Unlocking Permutations 1. 解题思路 这一题其实就是一个脑筋急转弯&#xff0c;要想要能够将所有的电脑解锁&#x…...

Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility

Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility 1. 实验室环境1.1 实验室环境1.2 小测试 2. The Endor System2.1 部署应用2.2 检查现有策略 3. Cilium 策略实体3.1 创建 allow-all 网络策略3.2 在 Hubble CLI 中验证网络策略源3.3 …...

【磁盘】每天掌握一个Linux命令 - iostat

目录 【磁盘】每天掌握一个Linux命令 - iostat工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景 注意事项 【磁盘】每天掌握一个Linux命令 - iostat 工具概述 iostat&#xff08;I/O Statistics&#xff09;是Linux系统下用于监视系统输入输出设备和CPU使…...

spring:实例工厂方法获取bean

spring处理使用静态工厂方法获取bean实例&#xff0c;也可以通过实例工厂方法获取bean实例。 实例工厂方法步骤如下&#xff1a; 定义实例工厂类&#xff08;Java代码&#xff09;&#xff0c;定义实例工厂&#xff08;xml&#xff09;&#xff0c;定义调用实例工厂&#xff…...

【Oracle】分区表

个人主页&#xff1a;Guiat 归属专栏&#xff1a;Oracle 文章目录 1. 分区表基础概述1.1 分区表的概念与优势1.2 分区类型概览1.3 分区表的工作原理 2. 范围分区 (RANGE Partitioning)2.1 基础范围分区2.1.1 按日期范围分区2.1.2 按数值范围分区 2.2 间隔分区 (INTERVAL Partit…...

在web-view 加载的本地及远程HTML中调用uniapp的API及网页和vue页面是如何通讯的?

uni-app 中 Web-view 与 Vue 页面的通讯机制详解 一、Web-view 简介 Web-view 是 uni-app 提供的一个重要组件&#xff0c;用于在原生应用中加载 HTML 页面&#xff1a; 支持加载本地 HTML 文件支持加载远程 HTML 页面实现 Web 与原生的双向通讯可用于嵌入第三方网页或 H5 应…...