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

第16章 直接定址表

目录

  • 16.1 描述了单元长度的标号
  • 16.2 在其它段中使用数据标号
  • 16.3 直接定址表
  • 16.4 程序入口地址的直接定址表
  • 实验16 编写包含多个功能子程序的中断例程

16.1 描述了单元长度的标号

assume cs:code
code segment
a db 1,2,3,4,5,6,7,8
b dw 0
start: mov si,0
     mov cx,0
s:   mov al,a[si]
     mov ah,0
     add b,ax
     inc si
     loop s
     mov ax,4c00h
     int 21h
code ends
end start

    在code段中使用的标号ab后面没有“:”,它们是同时描述内存地址和单元长度的标号。因为这种标号包含了对单元长度的描述,所以在指令中,它可以代表一个段中的内存单元

比如,对于程序中的“b dw 0”:
指令:mov ax,b
相当于:mov ax,cs:[8]
下面的指令会引起编译错误:
mov al,b
因为b代表的内存单元是字单元,而al是8位寄存器

    使用这种包含单元长度的标号,可以使我们以简洁的形式访问内存中的数据。这种标号称为 数据标号,它标记了存储数据的单元地址和长度。它不同于仅仅表示地址的 地址标号


我自己对数据标号、地址标号、offset、seg的总结
(1)之前见到的标号都是地址标号,代表内存单元的地址;这章学到的数据标号,不仅代表内存单元地址, 还代表了此地址处数据的单元长度
(2)本书中谈到内存单元地址可以拆分成 段地址:偏移地址,第9章学到的伪指令 “offset 标号”,就是 获得标号处的内存单元的偏移地址;下以小节学到的 “seg 标号” 操作符,就是 获得标号处的段地址
(3)在分析“seg”标号时,我总是纠结seg操作符怎么从标号中得到段地址的。后来我想明白了,我从了解到offset伪指令开始,到现在所写的检测点、每章的实验的代码,都把标号当作偏移地址用。 其实标号代表的是内存单元的地址,包括了段地址和偏移地址。只有“offset 标号”,得到的才是偏移地址。 学了这章之后还有注意:地址标号和数据标号的区别。


16.2 在其它段中使用数据标号

    一般来说,我们不在代码段中定义数据,而是将数据定义到其它段中。在其它段中,我们也可以使用数据标号来描述存储数据的单元的地址和长度。注意,在后面加有“:”的地址标号,只能在代码段中使用,不能在其它段中使用。

    如果想在代码段中直接使用数据标号访问数据,则需要用伪指令assume将标号所在的段和一个段寄存器联系起来。否则编译器在编译的时候,无法确定标号的段地址在哪个寄存器中。当然,这种联系是编译器需要的,但决定不是说,我们用assume指令将段寄存器和某个段相联系,段寄存器中就会真的存放该段的地址。 我们在程序中还要使用指令对寄存器进行设置。

    可以将标号当作数据来定义,此时,编译器将标号所表示的地址当作数据值。

data segment
    a db 1,2,3,4,5,6,7.8
    b dw 0
    c dw a,b
    d dd a,b
data ends
数据标号c处存储的两个字型数据为标号a、b的偏移地址
数据标号d处存储的两个双字型数据为标号a的偏移地址和段地址、标号b的偏移地址和段地址
上面因为dw和dd的不同得到不同的地址要细细体会

seg操作符,功能为取得某一标号的段地址。 参考offset




16.3 直接定址表

    可以通过依据数据,直接计算出所要找的元素的位置的表,我们称其为**直接定址表**。


    结合我以前学习C语言指针的知识,我对这小节的理解就是:合理的利用资源建立映射关系,方便我们查找数据。
    要注意利用数据标号访问数据时,虽然数据标号包含数据的单元长度,但偏移的计算还是以字节为单位
水平有限,个人代码仅供参考:(比书中代码,附加了判断角度值是否在范围内)

assume cs:code,ds:datadata segmenttableAg	db 0,30,60,90,120,150,180table	dw ag0,ag30,ag60,ag90,ag120,ag150,ag180string	db 'The angle is not in the range !',0ag0	db '0',0ag30	db '0.5',0ag60	db '0.866',0ag90	db '1',0ag120	db '0.866',0ag150	db '0.5',0ag180	db '0',0
data endscode segment
start:mov ax,datamov ds,axmov al,91				;输入角度call jdgAgl				;判断输入角度是否在能显示的范围内call getVal				;显示角度对应的sin值mov ax,4c00hint 21h
;功能:判断输入的角度数是否在tableAg的范围内,如果不在屏幕就显示“The angle is not in the range!”
;参数:al=输入的角度
;返回:无
jdgAgl:push sipush cxpush axpush dspush simov si,0mov cx,7cycJdg:		cmp al,tableAg[si]			;循环判断输入的角度,是否在范围内je endJdginc siloop cycJdgmov ax,datamov ds,axmov si,offset stringcall showStrjmp reDosendJdg:		pop si					;角度判断通过,返回程序,继续运行pop dspop axpop cxpop siretreDos:		mov ax,4c00h				;角度判断不通过,结束程序返回dos系统int 21h;功能:根据输入角度得到对应的sin值
;参数:al=输入角度
;返回:无
getVal:push axpush bxpush simov ah,0mov bl,30div bl					;根据输入角度计算表中的索引mov bl,almov bh,0add bx,bx				;根据表中数据单元的长度(byte/word/dword)来调整访问表的索引mov si,table[bx]			mov ax,datamov ds,axcall showStrpop sipop bxpop axret;功能:显示指定地址处以0结尾的字符串
;参数:ds=字符串的段地址 si=字符串偏移地址
;参数:无
showStr:			push axpush espush dipush simov ax,0b800hmov es,axmov di,12*160+30*2		;es:di指向显存中显示字符串的首地址cycSh:		mov al,[si]			;显示字符串cmp al,0je endCyc			;遇到字符串结尾的0,结束循环mov es:[di],alinc siadd di,2jmp short cycShendCyc:		pop sipop dipop espop axretcode endsend start



16.4 程序入口地址的直接定址表


    如果你理解了直接定址表,那这小节没什么新内容,核心还是不变的,你只要设计好数值和表之间的映射关系。

水平有限,个人代码仅供参考:(比书中代码,增加了一个对颜色值范围的判断)

assume cs:code,ds:datadata segmenttabCol	db 0,1,2,3,4,5,6,7string	db 'the color is not in the range!',0
data endscode segmenttable	dw clScreen,setFroCol,setBacCol,upRoll
start:				mov ax,datamov ds,axmov ax,0b800hmov es,axmov ah,0					;选择功能mov bl,ahmov bh,0add bx,bxmov al,4					;传递颜色值mov ah,0call word ptr table[bx]mov ax,4c00hint 21h;功能:清屏
;参数:es=显存段地址
;返回:无
clScreen:push cxpush dimov cx,2000mov di,0cycCl:		mov byte ptr es:[di],' 'add di,2loop cycClpop dipop cxret;功能:设置前景色
;参数:es=显存段地址 al=前景色  范围0~7
;返回:无
setFroCol:push cxpush axpush dicall jdgCol					;判断al的值在不在允许范围内mov cx,2000					;准备设置前景色mov di,1cycSfr:		and byte ptr es:[di],11111000b			;循环设置前景色or es:[di],aladd di,2loop cycSfrpop dipop axpop cxret;功能:设置背景色
;参数:es=显存段地址 al=前景色  范围0~7
;返回:无
setBacCol:push cxpush axpush dicall jdgCol					;判断al的值在不在允许范围内mov cl,4shl al,cl					;左移,将颜色值移动到背景色的位置mov cx,2000					;准备设置背景色mov di,1cycSba:		and byte ptr es:[di],10001111b			;循环设置背景色or es:[di],al					add di,2loop cycSbapop dipop axpop cxret;功能:向上滚动一行
;参数:无
;返回:无
upRoll:push axpush dspush espush sipush dipush cxmov ax,0b800hmov ds,axmov es,axmov si,160	mov di,0cycRo:		mov cx,80cldrep movswcmp si,4000jne cycRomov cx,80mov si,0laRow:		mov byte ptr es:[160*24+si],' '				;最后一行设为空add si,2loop laRowpop cxpop dipop sipop espop dspop axret
;功能:显示指定地址处以0结尾的字符串
;参数:ds=字符串的段地址 si=字符串偏移地址
;参数:无
showStr:			push axpush espush dipush simov ax,0b800hmov es,axmov di,12*160+30*2		;es:di指向显存中显示字符串的首地址cycSh:		mov al,[si]			;显示字符串cmp al,0je endCyc			;遇到字符串结尾的0,结束循环mov es:[di],alinc siadd di,2jmp short cycShendCyc:		pop sipop dipop espop axret;功能:判断输入的颜色值是否在给定的范围内
;参数:al=输入的颜色值
;返回:无
jdgCol:push sipush cxpush axmov si,0mov cx,8cycJdg:		cmp al,tabCol[si]				;判断al中前景色值在不在允许的范围内je endJdginc siloop cycJdgmov si,offset stringcall showStrmov ax,4c00h					;如果输入的颜色值不在允许的范围内,直接结束程序int 21hendJdg:		pop axpop cxpop siretcode endsend start



实验16 编写包含多个功能子程序的中断例程

    这个实验的重点要关注,中断例程安装完成后,中断例程调用其它子程序时,地址的设置。在安装程序中,中断例程不会执行,安装程序中所有对内存访问的地址基础,是安装程序所在的地址空间,这个空间是DOS系统分配的;安装完成后,中断例程对内存访问的地址基础,是安装的位置。我的实验里中断例程安装在0000:0200处,所以中断例程中代码访问内存的地址基础就是0000:0200。这里的区别要注意,要仔细体会,如果你之前了解过高级语言关于“与位置无关代码”的介绍,那理解很容易。

水平有限,个人代码仅供参考:(代码内不包含,测试部分,有兴趣的安装完中断例程,自己写个单独的测试文件,我已测试通过)

assume cs:codecode segment
;安装程序,将中断例程安装到0000:0200处
start:				mov ax,csmov ds,axmov si,offset int7cmov ax,0mov es,axmov di,0200hmov cx,offset int7cE-offset int7ccldrep movsb;修改中断向量表,使int 7c指向新中断例程climov ax,0mov es,axmov word ptr es:[7ch*4],0200hmov word ptr es:[7ch*4+2],0stimov ax,4c00hint 21h
;中断例程
int7c:				push axpush espush bxjmp short begitable	dw offset clScreen-offset int7c+0200h,offset setFroCol-offset int7c+0200h,offset setBacCol-offset int7c+0200h,offset upRoll-offset int7c+0200htabCol	db 0,1,2,3,4,5,6,7string	db 'the color is not in the range!',0
begi:				push axmov ax,0b800hmov es,axpop axmov bl,ah				;功能号mov bh,0add bx,bx	call word ptr cs:[offset table-offset int7c+0200h+bx]pop bxpop espop axiretclScreen:								;清屏push cxpush dimov cx,2000mov di,0cycCl:		mov byte ptr es:[di],' 'add di,2loop cycClpop dipop cxretsetFroCol:								;设置前景色push cxpush axpush dicall jdgCol					;判断al的值在不在允许范围内mov cx,2000					;准备设置前景色mov di,1cycSfr:		and byte ptr es:[di],11111000b			;循环设置前景色or es:[di],aladd di,2loop cycSfrpop dipop axpop cxretsetBacCol:								;设置背景色push cxpush axpush dicall jdgCol					;判断al的值在不在允许范围内mov cl,4shl al,cl					;左移,将颜色值移动到背景色的位置mov cx,2000					;准备设置背景色mov di,1cycSba:		and byte ptr es:[di],10001111b			;循环设置背景色or es:[di],al					add di,2loop cycSbapop dipop axpop cxretupRoll:									;向上滚动push axpush dspush sipush dipush cxmov ax,0b800hmov ds,axmov si,160	mov di,0cycRo:		mov cx,80cldrep movswcmp si,4000jne cycRomov cx,80mov si,0laRow:		mov byte ptr es:[160*24+si],' '				;最后一行设为空add si,2loop laRowpop cxpop dipop sipop dspop axretshowStr:							;显示字符串	push axpush dipush simov di,12*160+30*2		;es:di指向显存中显示字符串的首地址cycSh:		mov al,[si]			;显示字符串cmp al,0je endCyc			;遇到字符串结尾的0,结束循环mov es:[di],alinc siadd di,2jmp short cycShendCyc:		pop sipop dipop axretjdgCol:								;判断颜色值是否在范围内push sipush cxpush axmov si,0mov cx,8cycJdg:		cmp al,cs:[offset tabcol-offset int7c+200h+si]				;判断al中前景色值在不在允许的范围内je endJdginc siloop cycJdgmov si,offset string-offset int7c+200hcall showStrmov ax,4c00h					;如果输入的颜色值不在允许的范围内,直接结束程序int 21hendJdg:		pop axpop cxpop siret
int7cE:				nop
code ends
end start

相关文章:

第16章 直接定址表

目录 16.1 描述了单元长度的标号16.2 在其它段中使用数据标号16.3 直接定址表16.4 程序入口地址的直接定址表实验16 编写包含多个功能子程序的中断例程 16.1 描述了单元长度的标号 assume cs:code code segment a db 1,2,3,4,5,6,7,8 b dw 0 start: mov si,0      mov cx…...

【AI深度学习网络】卷积神经网络(CNN)入门指南:从生物启发的原理到现代架构演进

深度神经网络系列文章 【AI深度学习网络】卷积神经网络(CNN)入门指南:从生物启发的原理到现代架构演进【AI实践】基于TensorFlow/Keras的CNN(卷积神经网络)简单实现:手写数字识别的工程实践 引言 在当今…...

江科大51单片机笔记【10】蜂鸣器播放提示器音乐(下)

一、蜂鸣器播放提示器 这里我们要用Key,Delay,Nixie模块 并且把Nixie.c函数里的这两句注释,因为之前是动态显示,延时后马上清零,现在是静态显示,所以需要把他注释掉 // Delay(1); // P00x00; 先验…...

Milvus JSON数据存储优化方案

无论是json数据还是string/varchar 类型数据,其长度都不能超过65536,这是根本,不像ES的text类型数据一样,可以无限长。 总结 数据类型适用场景最大长度STRINGMilvus <2.2.x 的短文本(<65KB)隐式 ≈65,535 字节VARCHAR(N)Milvus ≥2.2.x 的文本显式 N≤65,535 字符…...

MySQL 数据库连接池爆满问题排查与解决

目录 MySQL 数据库连接池爆满问题排查与解决 一、问题影响 二、问题确认 三、收集信息 四、SQL 语句分析 五、应用层代码分析 六、连接池配置检查 七、监控工具使用 八、案例分析 在实际的应用开发中&#xff0c;我们可能会遇到 MySQL 数据库连接池爆满的情况。这种情…...

PyTorch深度学习的梯度消失和梯度爆炸的识别、解决和最佳实践

通过结合梯度监控、网络架构改进和优化策略&#xff0c;可以有效应对梯度消失/爆炸问题。建议在模型开发初期就加入梯度监控机制&#xff0c;这有助于快速定位问题层。对于超深网络&#xff08;>50层&#xff09;&#xff0c;建议优先考虑使用预激活残差结构&#xff08;Res…...

Nginx1.19.2不适配OPENSSL3.0问题

Nginx 1.19.2 是较老的版本&#xff0c;而 Nginx 1.21 版本已经适配 OpenSSL 3.0&#xff0c;所以建议 升级 Nginx 到 1.25.0 或更高版本&#xff1a; wget http://nginx.org/download/nginx-1.25.0.tar.gz tar -xzf nginx-1.25.0.tar.gz cd nginx-1.25.0 ./configure --prefix…...

蓝桥杯 Excel地址

Excel地址 题目描述 Excel 单元格的地址表示很有趣&#xff0c;它使用字母来表示列号。 比如&#xff0c; A 表示第 1 列&#xff0c; B 表示第 2 列&#xff0c; Z 表示第 26 列&#xff0c; AA 表示第 27 列&#xff0c; AB 表示第 28 列&#xff0c; BA 表示第 53 列&#x…...

免费pdf格式转换工具

基本功能 - 支持单文件转换和批量转换两种模式 - 内置PDF文件预览功能 - 支持8种常见格式转换&#xff1a;Word、Excel、JPG/PNG图片、HTML、文本、PowerPoint和ePub 单文件转换功能 - 文件选择&#xff1a;支持浏览和选择单个PDF文件 - 输出位置&#xff1a;可自定义设置输出…...

I²C总线应用场景及1.8V与3.3V电压选择

以下是关于IC总线应用场景及1.8V与3.3V电压选择的详细分析: 一、IC总线的典型应用场景 1. 板内通信(主要场景) 描述:IC 最初设计是为电路板(PCB)上的芯片间短距离通信,尤其适用于集成度高的系统。典型器件: 传感器模块(如温湿度传感器BME280)。存储芯片(如EEPROM 2…...

css错峰布局/瀑布流样式(类似于快手样式)

当样式一侧比较高的时候会自动换行&#xff0c;尽量保持高度大概一致&#xff0c; 例&#xff1a; 一侧元素为5&#xff0c;另一侧元素为6 当为5的一侧过于高的时候&#xff0c;可能会变为4/7分部dom节点 如果不需要这样的话删除样式 flex-flow:column wrap; 设置父级dom样…...

Deepseek中的MoE架构的改造:动态可变参数激活的MoE混合专家架构(DVPA-MoE)的考虑

大家好,我是微学AI,今天给大家介绍一下动态可变参数激活MoE架构(Dynamic Variable Parameter-Activated MoE, DVPA-MoE)的架构与实际应用,本架构支持从7B到32B的等多档参数动态激活。该架构通过细粒度难度评估和分层专家路由,实现“小问题用小参数,大问题用大参数”的精…...

docker-compose Install reranker(fastgpt支持) GPU模式

前言BGE-重新排名器 与 embedding 模型不同&#xff0c;reranker 或 cross-encoder 使用 question 和 document 作为输入&#xff0c;直接输出相似性而不是 embedding。 为了平衡准确性和时间成本&#xff0c;cross-encoder 被广泛用于对其他简单模型检索到的前 k 个文档进行重…...

doris: MySQL

Doris JDBC Catalog 支持通过标准 JDBC 接口连接 MySQL 数据库。本文档介绍如何配置 MySQL 数据库连接。 使用须知​ 要连接到 MySQL 数据库&#xff0c;您需要 MySQL 5.7, 8.0 或更高版本 MySQL 数据库的 JDBC 驱动程序&#xff0c;您可以从 Maven 仓库下载最新或指定版本的…...

JVM参数调整

一、内存相关参数 1. 堆内存控制 -Xmx&#xff1a;最大堆内存&#xff08;如 -Xmx4g&#xff0c;默认物理内存1/4&#xff09;。-Xms&#xff1a;初始堆内存&#xff08;建议与-Xmx相等&#xff0c;避免动态扩容带来的性能波动&#xff09;。-Xmn&#xff1a;新生代大小&…...

【DeepSeek问答】访问QStandardItemModel::index(r,c)获取的空索引导致程序崩溃

好的&#xff0c;我现在来仔细思考一下用户的问题。用户在使用QStandardItemModel的setItem方法时&#xff0c;调用了setItem(4,6,item)&#xff0c;也就是在第4行第6列的位置设置了一个item。然后他们尝试通过index(3,6)来获取这个位置的项目&#xff0c;想知道会有什么后果。…...

基于websocket的多用户网页五子棋 --- 测试报告

目录 功能测试自动化测试性能测试 功能测试 1.登录注册页面 2.游戏大厅页面 3.游戏房间页面 自动化测试 1.使用脑图编写web自动化测试用例 2.创建自动化项目&#xff0c;根据用例通过selenium来实现脚本 根据脑图进行测试用例的编写&#xff1a; 每个页面一个测试类&am…...

在 macOS 上使用 CLion 进行 Google Test 单元测试

介绍 Google Test&#xff08;GTest&#xff09;是 Google 开源的 C 单元测试框架&#xff0c;它提供了简单易用的断言、测试夹具&#xff08;Fixtures&#xff09;和测试运行机制&#xff0c;使 C 开发者能够编写高效的单元测试。 本博客将介绍如何在 macOS 上使用 CLion 配…...

深度解码!清华大学第六弹《AIGC发展研究3.0版》

在Grok3与GPT-4.5相继发布之际&#xff0c;《AIGC发展研究3.0版》的重磅报告——这份长达200页的行业圣经&#xff0c;不仅预测了2025年AI技术爆发点&#xff0c;更将「天人合一」的东方智慧融入AI伦理建构&#xff0c;堪称数字时代的《道德经》。 文档&#xff1a;清华大学第…...

【论文笔记】Attentive Eraser

标题&#xff1a;Attentive Eraser: Unleashing Diffusion Model’s Object Removal Potential via Self-Attention Redirection Guidance Source&#xff1a;https://arxiv.org/pdf/2412.12974 收录&#xff1a;AAAI 25 作者单位&#xff1a;浙工商&#xff0c;字节&#…...

97k倍区间

97k倍区间 ⭐️难度&#xff1a;中等 &#x1f31f;考点&#xff1a;暴力&#xff0c;2017省赛 &#x1f4d6; &#x1f4da; import java.util.Scanner;public class Main {static int N 100010;public static void main(String[] args) {Scanner sc new Scanner(System.…...

cursor使用经验分享(java后端服务开发向)

前言 cursor是一款基于vscode&#xff0c;并集成AI能力的代码编辑器&#xff0c;其功能包括但不限于代码生成及补全、AI对话&#xff08;能够直接将代码环境作为上下文&#xff09;、即时应用建议等等&#xff0c;是一款面向未来的代码编辑器。 对于vscode&#xff0c;最先想…...

SpringBoot3—场景整合:AOT

一、AOT与JIT AOT&#xff1a;Ahead-of-Time&#xff08;提前编译&#xff09;&#xff1a;程序执行前&#xff0c;全部被编译成机器码 JIT&#xff1a;Just in Time&#xff08;即时编译&#xff09;: 程序边编译&#xff0c;边运行&#xff1b; 编译&#xff1a;源代码&am…...

蓝桥与力扣刷题(蓝桥 数字三角形)

题目&#xff1a; 上图给出了一个数字三角形。从三角形的顶部到底部有很多条不同的路径。对于每条路径&#xff0c;把路径上面的数加起来可以得到一个和&#xff0c;你的任务就是找到最大的和&#xff08;路径上的每一步只可沿左斜线向下或右斜线向下走&#xff09;。 输入描述…...

蓝桥试题:传球游戏(二维dp)

一、题目描述 上体育课的时候&#xff0c;小蛮的老师经常带着同学们一起做游戏。这次&#xff0c;老师带着同学们一起做传球游戏。 游戏规则是这样的&#xff1a;n 个同学站成一个圆圈&#xff0c;其中的一个同学手里拿着一个球&#xff0c;当老师吹哨子时开始传球&#xff0…...

游戏引擎学习第138天

仓库:https://gitee.com/mrxiao_com/2d_game_3 资产&#xff1a;game_hero_test_assets_003.zip 发布 我们的目标是展示游戏运行时的完整过程&#xff0c;从像素渲染到不使用GPU的方式&#xff0c;我们自己编写了渲染器并完成了所有的工作。今天我们开始了一些新的内容&#…...

Lab 3 Page Table

题目链接 我的问题&#xff1a; 1 每个进程的kernel stack是干啥的来着&#xff1f;在何时初始化的&#xff1f; 题目2&#xff1a;A kernel page table per process (hard) 1 一些题目要求 Your first job is to modify the kernel so that every process uses its own c…...

嵌入式学习L5D2-exec函数族和守护进程

exec函数族1 下面那个加了p环境变量就不用那个了。 输出的是系统 exec函数族2 后面不执行了 第二个参数瞎写也可以&#xff0c;但是要填 这里是说不想被替换&#xff0c;就在子进程里面执行这个。 守护进程概念 后台进程 守护进程是后台进程 一个fork了一个进程&#xff…...

洛谷P1091

题目如下 思路 谢谢观看...

行为模式---迭代器模式

概念 迭代器模式是设计模式的行为模式&#xff0c;它的主要设计思想是提供一个可以操作聚合对象&#xff08;容器或者复杂数据类型&#xff09;表示&#xff08;迭代器类&#xff09;。通过迭代器类去访问操作聚合对象可以隐藏内部表示&#xff0c;也可以使客户端可以统一处理…...