《汇编语言》- 读书笔记 - 第8章 - 数据处理的两个基本问题(阶段总结)

《汇编语言》- 读书笔记 - 第8章 - 数据处理的两个基本问题(阶段总结)

  • 8.1 bx、si、di 和 bp (可用于内存寻址)
  • 8.2 机器指令处理的数据在什么地方
  • 8.3 汇编语言中数据位置的表达
    • 1. 立即数(idata)
    • 2. 寄存器
    • 3. 段地址(SA)和偏移地址(EA)
  • 8.4 寻址方式
  • 8.5 指令要处理的数据有多长(如何定义)
    • 1. 通过:寄存器名
    • 2. 通过:操作符 word ptrbyte ptr
    • 3. 其它方法
  • 8.6 寻址方式的综合应用
  • 8.7 指令 div
  • 8.8 伪指令 db、dw、dd
    • 问题 8.1
        • 1. 完整代码
        • 2. 执行后在 debug 中反编译看下
        • 3. 执行一下查看内存中数据段
  • 8.9 操作符 dup
  • 实验 7 寻址方式在结构化数据访问中的应用

8.1 bx、si、di 和 bp (可用于内存寻址)

  1. 8086CPU 中,只有 这4个 寄存器可以用在[...]中来进行内存单元的寻址
    1.1. 这4个 寄存器都可以单独使用。
    1.2. 通常是单独使用 bxbp。在实现更复杂的内存寻址时,用 sidibxbp 组合。
    1.3. 还可以加立即数
  2. 允许的组合方式如下表:( bxbpsidi 不能直接组合 )
寄存器单独使用si组合di 组合立即数组合
bx[ bx ][ bx + si ][ bx + di ][ bx + idata ]
[ bx + si + idata ]
pb[ pb ][ pb + si ][ pb + di ][ pb + idata ]
[ pb + si + idata ]
  1. 使用 bx 时默认的段地址在 ds,如:mov ax, [bx]; mov ax, [bx+si]; mov ax, [bx+si+idata]
    使用 bp 时默认的段地址在 ss,如:mov ax, [bp]; mov ax, [bp+si]; mov ax, [bp+si+idata]
    3.1. 如果需要在其他段中寻址,则需要显式地指定相应的段前缀,如:
    mov ax, es:[bx]; mov ax, es:[bx+si]; mov ax, es:[bx+si+idata]
    mov ax, cs:[bx]; mov ax, cs:[bx+si]; mov ax, cs:[bx+si+idata]

8.2 机器指令处理的数据在什么地方

3 个地方:CPU内部内存接口(将在后面的课程中进行讨论)

  • 表 8.1 指令举例
机器码汇编指令指令执行前数据的位置
8E1E0000mov bx,[0]内存,ds:0 单元
89C3mov bx,axCPU 内部,ax 寄存器
BB0100mov bx,1CPU 内部,1 在指令缓冲器中

8.3 汇编语言中数据位置的表达

汇编语言中用 3 个概念来表达数据的位置

1. 立即数(idata)

直接写在代码中的数据,在汇编语言中称为: 立即数。(它们执行前在 CPU 的指令缓冲器中)
可以简单的理解为汇编语言的字面量(只是类似,不是同相)。

mov ax,1
add bx,2000h
or bx,00010000b
mov al,'a'

2. 寄存器

指令要处理的数据寄存器中,在汇编指令中给出相应的寄存器名

mov ax,bx
mov ds,ax
push bx
mov ds:[0],bx
push ds
mov ss,ax
mov sp,ax

3. 段地址(SA)和偏移地址(EA)

要处理的数据在内存时,汇编指令中可用[X]的格式指出 EA、SA 在某个段寄存器中。

8.4 寻址方式

计算内存单元偏移地址方法称为寻址方式
在这里插入图片描述

8.5 指令要处理的数据有多长(如何定义)

8086CPU指令,可以处理 byte(8位) 和 word(16位) 两种尺寸的数据。

1. 通过:寄存器名

  1. 通过寄存器名知晓数据的尺寸。

使用AX、BX、CX、DX 这些16位寄存器,说明数据尺寸为,如:

mov ax,1
mov bx,ds:[0]
mov ds,ax
mov ds:[0],ax
inc ax
add ax,1000

使用ah、al、bh、bl、ch、cl、dh、dl 这些8位寄存器,说明数据尺寸为字节,如:

mov al,1
mov al,bl
mov al,ds:[0]
mov ds:[0],al
inc al
add al,100

2. 通过:操作符 word ptrbyte ptr

在没有寄存器名存在的情况下,可以用操作符 X ptr 指明内存单元的长度,X 在汇编指令中可以为 wordbyte

# 用 word ptr 指明访问的内存单元是一个字单元
mov word ptr ds:[0],1
inc word ptr [bx]
inc word ptr ds:[0]
add word ptr [bx],2

# 用 byte ptr 指明访问的内存单元是一个字节单元
mov byte ptr ds:[0],1
inc byte ptr [bx]
inc byte ptr ds:[0]
add byte ptr [bx],2
  • 书上的例子:
    假设我们用 Debug 查看内存的结果如下:
    2000:1000 FF FF FF FF FF FF ......
    使用 byte ptr 修改 2000:1000 位置结果为
    2000:1000 01 FF FF FF FF FF ......
    使用 word ptr 修改 2000:1000 位置结果为
    2000:1000 01 00 FF FF FF FF ......

3. 其它方法

有些指令默认了访问的是单元还是字节单元,
比如:push [1000H]无需指明访问数据的尺寸,因为 push 指令只进行操作。

8.6 寻址方式的综合应用

8086CPU提供了[bx+si+idata]的寻址方式,便于结构化数据的处理。

  1. bx:定位整个结构体,
  2. idata:定位结构体中的某一个数据项
  3. si:定位数组项中的每个元素。

且汇编语言提供了更为贴切的书写方式,如:[bx].idata[bx].idata [si]
对应C语言中的变量.数据项[字符]。如书中的C代码示例声明了这样一个结构体:

struct company {	/*声明一个公司记录的结构体*/
	char cn[3];		/*公司名称*/
	char hn[9];		/*总裁姓名*/
	int pm;			/*排名*/
	int sr;			/*收入*/
	char cp[3];		/*著名产品*/
}
/*定义一个公司记录的变量,内存中将存有一条公司的记录*/
struct company dec={ "DEC", "Ken Olsen", 137, 40, "PDP" };

8.7 指令 div

  1. 除数:可以是816位。可放存在寄存器内存
  2. 被除数:可以是1632位。
    2.1. 如果是16位,放在AX中。如果32位高16位DX
    2.2. 在DIV操作中被除数是用16还是32取决于除数用多少位来运算:
         除数用8位则被除数16位
         除数用16位则被除数32位
被除数位数AXDX
216位00000000 00000010
6553632位00000000 0000000000000000 00000001
  1. 结果:也取决于除数用多少位来运算。
    3.1. 除数用8位则。ALAH余数
    3.2. 除数用16位则。AXDX余数
除数余数
8位ALAH
16位AXDX

8.8 伪指令 db、dw、dd

缩写全称含义位数
dbdefine bytedata byte定义字节(1个字节)的数据8
dwdefine worddata word定义字(2个字节)的数据16
dddefine doubleworddata doubleword定义双字(4个字节)的数据32

问题 8.1

div 计算 data 段中第一个数据除以第二个数据后的结果,商存在第三个数据的存储单元中。

data segment
	dd 100001		; 被除数      dword(双字)32 位
	dw 100			; 除数        word ()16 位
	dw 0			; 存商的位置
data ends
  • 分析
    data 段中 dd 定义是被除数,做除法之前:
  1. data:0 字单元中的低 16 位存储在 ax
  2. data:2 字单元中的高 16 位存储在 dx
mov ax,data
mov ds ,ax
mov ax,ds:[0]			; ds:0 双字单元中的低 16 位存储在 ax 中
mov dx,ds:[2]			; ds:2 双字单元中的高 16 位存储在 dx 中
div word ptr ds:[4]		; 用 dx:ax 中的 32 位数据除以 ds:4 字单元中的数据
mov ds :[6],ax			; 将商存储在 ds:6 字单元中

1. 完整代码
assume cs:codesg, ds:data
data segment
	dd 100001				; 被除数 dword(双字)32 位
	dw 100					; 除数   word ()16 位
	dw 0					; 存商的位置
data ends

codesg segment
	mov ax,data				; 设置代码段位置。先用 ax 中转一手,才能装入 ds
	mov ds,ax
							; 读取 32位 双字节 被除数存入寄存器 dx:ax
	mov ax,ds:[0]			; 从 ds:0 处开始读取低 16'86A1' 存入 ax 中
	mov dx,ds:[2]			; 从 ds:2 处开始读取高 16'0001' 存入 dx 中
	div word ptr ds:[4]		; 用 dx:ax 中的 32 位数据除以 ds:4 字单元中的数据
	mov ds:[6],ax			; 将商存储在 ds:6 字单元中
codesg ends
end
2. 执行后在 debug 中反编译看下

u cs:0 002F 查看从程序开始到 002F 部分反编译结果。

  1. 我当前的学习环境,应该是没有任何额外的引导或启动代码的,所以程序通常从CS:0000H处开始执行。
  2. -u命令忘记了的话要可以回顾一下:Debug的使用
  3. 使用 -u命令查看反汇编结果时,可以看到数据段部分也显示了对应的汇编代码,但这只是debug自作多情罢了。因为这段内容只会被当作数据读取。虽然可以一根筋的把它翻译成汇编代码,但是然并卵,它只是一段数据。

在这里插入图片描述

3. 执行一下查看内存中数据段

在这里插入图片描述

  • 我们分析一下 dd 100001 另外两个同理。
    10进制 100001 转16进制后是 186A1
    由于声明的是双字节有32位,所以高位要补零,得到:00 01 86 A1
    然后先低后高保到内存里就是 A1 86 01 00

在这里插入图片描述

8.9 操作符 dup

dup 操作符在汇编语言中是一个用于简化定义重复数据的操作符。
它通常与数据定义伪指令(如 db、dw、dd 等)结合使用,以指定重复特定模式的数据块的次数

指令描述生成的数据
db 5 dup(0) 定义5个字节,每个字节的值都为000 00 00 00 00
dw 3 dup(0x1234) 定义6个字节(因为dw是定义字,占两个字节),每个字的值都是0x123434 12 34 12 34 12
dd 2 dup(0x12345678) 定义8个字节(因为dd是定义双字,占四个字节),每个双字的值都是0x1234567878 56 34 12 78 56 34 12
db 4 dup(1, 2, 3) 定义12个字节,按照序列1、2、3重复四次01 02 03 01 02 03 01 02 03 01 02 03
————————————

实验 7 寻址方式在结构化数据访问中的应用

《汇编语言》- 读书笔记 - 实验 7 寻址方式在结构化数据访问中的应用

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

HPA自动扩缩容

HPA是什么??? Horizontal Pod Autoscaling: k8s自带的模块,pod的水平自动伸缩,对象是pod。 pod占用cpu比率达到一定的阈值,将会触发伸缩机制。 replication controller 副本控制器 deployment controll…

【ZYNQ入门】第九篇、双帧缓存的原理

目录 第一部分、基础知识 1、HDMI视频撕裂的原理 2、双帧缓存的原理 第二部分、代码设计原理 1、AXI_HP_WR模块 2、AXI_HP_RD模块 3、Block design设计 第三部分、总结 1、写在最后 2、更多文章 第一部分、基础知识 1、HDMI视频撕裂的原理 在调试摄像头的时候&#xf…

CMS如何调优

业务JVM频繁Full GC如何排查 原则是先止损,再排查。 FGC的原因是对象晋升失败或者并发模式失败,原因都是老年代放不下晋升的对象了。 1.可能是大对象导致的内存泄漏。快速排查方法:观察数据库网络IO是否和FGC时间点吻合,找到对应…

Servlet生命周期

第一阶段: init()初始化阶段 当客户端想Servlet容器(例如Tomcat)发出HTTP请求要求访问Servlet时,Servlet容器首先会解析请求,检查内存中是否已经有了该Servlet对象,如果有&#xff…

机器人制作开源方案 | 全自动导航分拣机器人

作者:孙国峰 董阳 张鑫源 单位:山东科技大学 机械电子工程学院 指导老师:张永超 贝广霞 1. 研究意义 1.1 研究背景 在工业生产中,机器人在解决企业的劳动力不足,提高企业劳动生产率,提高产品质量和降低…

【c++学习】数据结构中的链表

c链表 数据结构中的链表代码 数据结构中的链表 链表与线性表相对&#xff0c;链表数据在内存中的存储空间是不连续的&#xff0c;链表每个节点包含数据域和指针域。 代码 下述代码实现了链表及其接口 包括增、删、查、改以及其他一些简单的功能 #include <iostream>u…

FRRouting学习(一) 配置日志文件

以配置isis event事件日志为例 1、在配置之前&#xff0c;/var/log/frr路径下是没有文件的&#xff1a; 2、在vtysh config之下输入&#xff1a;log file /var/log/frr/isisd.log debugging 后面的debugging表示日志级别&#xff0c;可以根据自己修改 3、配置好了之后&#xf…

java——数据类型与变量

目录 &#x1f469;&#x1f3fb;‍&#x1f4bb;字面常量 &#x1f469;&#x1f3fb;‍&#x1f4bb;数据类型 &#x1f469;&#x1f3fb;‍&#x1f4bb;变量 ❗整型变量 &#x1f449;int(整型)默认值 &#x1f449;long(长整型) &#x1f449;short(短整型) &…

webpack如何把dist.js中某个模块js打包成一个全局变量,使得在html引入dist.js后可以直接访问

webpack可以通过使用expose-loader来将模块中的一个js文件暴露为全局可以访问的变量。下面是一个示例代码&#xff1a; 1、安装expose-loader npm install expose-loader --save-dev 2、webpack.config.js配置文件 值得注意的是&#xff1a;我在本地使用16.14.2版本的node打包…

Springboot+vue的医院后台管理系统(有报告),Javaee项目,springboot vue前后端分离项目

演示视频&#xff1a; Springbootvue的医院后台管理系统&#xff08;有报告&#xff09;&#xff0c;Javaee项目&#xff0c;springboot vue前后端分离项目 项目介绍&#xff1a; 本文设计了一个基于Springbootvue的前后端分离的医院后台管理系统&#xff0c;采用M&#xff08…

博捷芯划片机在半导体芯片切割领域的领先实力

在当今高速发展的半导体行业中&#xff0c;芯片切割作为制造过程中的核心技术环节&#xff0c;对设备的性能和精度要求日益提升。在这方面&#xff0c;国内知名划片机企业博捷芯凭借其卓越的技术实力和持续的创新精神&#xff0c;成功研发出具备完全自主知识产权的半导体切割划…

基于springboot+vue的海滨体育馆管理系统(前后端分离)

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战 主要内容&#xff1a;毕业设计(Javaweb项目|小程序等)、简历模板、学习资料、面试题库、技术咨询 文末联系获取 研究背景…

牛客周赛 Round 18 解题报告 | 珂学家 | 分类讨论计数 + 状态DP

前言 整体评价 前三题蛮简单的&#xff0c;T4是一个带状态的DP&#xff0c;这题如果用背包思路去解&#xff0c;不知道如何搞&#xff0c;感觉有点头痛。所以最后还是选择状态DP来求解。 欢迎关注 珂朵莉 牛客周赛专栏 珂朵莉 牛客小白月赛专栏 A. 游游的整数翻转 这题最好…

基于GPT3.5逆向 和 本地Bert-Vits2-2.3 的语音智能助手

文章目录 一、效果演示二、操作步骤三、架构解析 一、效果演示 各位读者你们好&#xff0c;我最近在研究一个语音助手的项目&#xff0c;是基于GPT3.5网页版的逆向和本地BertVits2-2.3 文字转语音&#xff0c;能实现的事情感觉还挺多&#xff0c;目前实现【无需翻墙&#xff0…

UV紫外激光打标机的优缺点是什么

​ UV紫外激光打标机具有以下优点&#xff1a; 1. 精度高&#xff1a;紫外激光打标机的光束质量好&#xff0c;聚焦光斑小&#xff0c;可以实现在各种材料上进行超精细打标。 2. 速度快&#xff1a;由于紫外激光的独特特性&#xff0c;打标速度非常快&#xff0c;提高了生产效…

SpringSecurity认证登录成功后获取角色菜单

目录 前言 一、RBAC模型 二、实战应用 1. 建立用户、角色、资源实体类 2. 数据层查询角色资源 3. 业务层实现&#xff0c;调用数据层查询接口 4. SystemController控制器菜单获取方法 5. menu.jsp菜单页面实现 前言 本篇文章接SSM项目集成Spring Security 4.X版本&…

搭建nodejs服务器

简单搭建nodejs服务器&#xff0c;用于爬虫js逆向. 1、安装镜像源 下载nrm npm install -g nrm 设置下载源&#xff1a;&#xff08;最好使用npm源或者淘宝源&#xff09; 例子&#xff1a;npm config set registry http://registry.npmjs.org 查看是否设置成功&#xff1a…

数据结构之线性表(一般的线性表)

前言 接下来就开始正式进入数据结构环节了&#xff0c;我们先从线性表开始。 线性表 线性表&#xff08;linear list&#xff09;也叫线性存储结构&#xff0c;即数据元素的逻辑结构为线性的数据表&#xff0c;它是数据结构中最简单和最常用的一种存储结构&#xff0c;专门存…

探索文件与交互:使用PyQt5构建一个高级文件选择器

在当今的应用程序开发中&#xff0c;文件管理和交互是一个重要的组成部分。特别是对于桌面应用程序&#xff0c;提供一个直观、功能丰富的文件选择器是提高用户体验的关键。 本篇博客&#xff0c;我将介绍如何使用Python和PyQt5来构建一个高级的文件选择器&#xff0c;它不仅能…

Linux操作系统概念

绪论​&#xff1a; “心灵纯洁的人&#xff0c;生活充满甜蜜和喜悦。——列夫托尔斯泰”&#xff0c;本章的主要内容是介绍了硬件的组成结构冯诺依曼体系结构以及操作系统的概念和操作系统的作用&#xff0c;本章的内容主要是理论他起到承上启下的作用只有理解了操作系统的运行…