标号

1,关于地址标号a:,带有冒号的形式,之前我们一直使用。这种标号被用来标记指令,数据的起始地址,表示内存单元的起始地址。
      后面带有冒号的地址标号,只能在代码段中使用,不能在其他段中使用。
      例:将code段中a标号处的8个字节数据累加到b标号处的字中。

     assume cs:codecode segmenta: db 1,2,3,4,5,6,7,8b: dw 0start: mov si,offset amov bx,offset bmov cx,8s: mov al,cs:[si]mov ah,0add cs:[bx],axinc siloop smov ax,4c00hint 21hcode endsend start

2,还有一种标号我们称为数据标号a,不带冒号的形式。不但可以表示内存单元的地址,还表示了内存单元的长度,即表示在此标号处的单元是一个字节单元,还是字单元,还是双字单元。
      这种不带冒号的标号,除了可以在代码段中使用,更常被使用于数据段中
      例:同样功能的代码示例如下:

     assume cs:codecode segmenta db 1,2,3,4,5,6,7,8b dw 0start: mov si,0mov cx,8s: mov al,a[si]mov ah,0add b,axinc siloop smov ax,4c00hint 21hcode endsend start

在 code 段中使用的标号:标号a,描述了地址code:0,和从这个地址开始,以后的内存单元都是字节单元;而标号b,描述了地址code:8,和从这个地址开始,以后的内存单元都是字单元。所以这种标号在指令可以代表一个段中的内存单元。单纯的 b (相当于 b[si],其中 si 为0)表示地址在 cs:[8] 处的一个字单元。类似的,a[si] 表示在地址 cs:0[si] 处的一个字节单元中,标号在哪个段中,那么标号所表示的内存单元的段地址就为相应的段寄存器(如 cs,ds…)。括号内的偏移量必须为 bx、si、di 和 bp中的一个。

检测点16.1

将code段中a处的8个数据累加,结果存储到b处的双字中:

     assume cs:codecode segmenta dw 1,2,3,4,5,6,7,8b dd 0start: mov si,0mov cx,8s: mov ax,a[si]add word ptr b[0],ax      ;需要显式指定运算对象为字单元adc word ptr b[2],0add si,2loop smov ax,4c00hint 21hcode endsend start

3,在其他段(数据段)中使用数据标号的情况。简而言之,使用数据标号时必须将它所在的段与某一个段寄存器相关联,并且在程序中需要用指令对该段寄存器进行设置。

     assume cs:code ds:data          ;1,将ds和数据标号所在段相关联data segmenta db 1,2,3,4,5,6,7,8b dw 0data endscode segmentmov ax,data                  ;2,这两句是将data段地址存放到ds中。mov ds,ax;下面就可以正常使用数据标号了mov si,0mov cx,8s: mov al,a[si]mov ah,0add b,axinc siloop smov ax,4c00hint 21hcode endsend start

使用数据标号的特殊情况:

         data segmenta db 1,2,3,4,5,6,7,8b dw 0c dw a,b  ;等同于 c dw offset a,offset bd dd a,b ;等同于 d dw offset a,seg a,offset b,seg bdata ends

在 c 标号处存储的两个字型数据是 标号a、b 的偏移地址。在 d 标号处存储的两个双字型数据为标号 a 的偏移地址、段地址和标号 b 的偏移地址、段地址。 seg 操作符为取得某一标号的段地址。

直接定址表

编写一个子程序:计算 sin(x),其中 x ∈{0,30,60,90,120,150,180},单位为度。并将结果显示在屏幕上。如 sin(90)=1,sin(30)=0.5。
      思路:如果要具体计算某个角度的 sin 值时,需要采用麦克劳林公式,计算非常费时。对于这 7 个角度,我们可以直接计算出它们的 sin 值并存储到一张表中,用空间来换取时间,对于给定的一个角度,通过查表就可以得到它的 sin 值了。
      子程序如下,其中 ax 来向子程序传递角度:

     showsin: jmp short showtable dw ag0,ag30,ag60,ag90,ag120,ag150,ag180 ag0   db'0',0                ;sin 0=0ag30  db '0.5',0         ;sin 30=0.5ag60  db '0.866',0            ;sin 60=0.866ag90  db '1',0ag120 db '0.866',0ag150 db '0.5',0ag180 db '0',0show: push bxpush espush simov bx,0b800hmov es,bx;计算出sin(x)对应结果字符串的偏移地址mov bl,30div bl              ;用角度值/30来得到相对于table的偏移mov bl,almov bh,0add bx,bx            ;因为table中是字单元,需要再乘2mov bx,table[bx]  ;bx中是对应结果字符串的偏移地址;显示对应结果字符串到屏幕mov si,160*12+40*2shows: mov ah,cs:[bx]cmp ah,0je showretmov es:[si],ahinc bxadd si,2jmp short showsshowret: pop si  pop espop bxret

像这种可以通过依据数据,直接计算出所要找的元素的位置的表,称其为直接定址表
      如果在直接定址表中存储子程序的地址,这样就可以方便地实现不同子程序的调用,这是直接定址表最常见的一种用法。下面通过实验16来具体说明。

实验16

编写包含多个功能子程序的中断例程:安装一个新的 int 7ch 中断例程,为显示输出提供如下功能子程序。
(1)清屏:
(2)设置前景色
(3)设置背景色
(4)向上滚动一行
      入口参数说明:用 ah 寄存器传递功能号:0表示清屏,1表示设置前景色,2表示设置背景色,3表示向上滚动一行;      对于1、2号功能,用al来传送颜色值,(al)∈{0,1,2,3,4,5,6,7}。

     assume cs:codecode segment;安装程序在内存0:200h处start: mov ax,0mov es,axmov di,200hmov ax,csmov ds,axmov si,offset int7chcldmov cx offset int7chend-offset int7chrep movsb;修改中断向量表mov word ptr es:[7c*4],200hmov word ptr es:[7c*4+2],0mov ax,4c00hint 21hint7ch: jmp short bodytable dw sub0,sub1,sub2,sub3   body: push bxcmp ah,3ja int7chretmov bl,ahmov bh,0add bx,bxcall word ptr table[bx]int7chret: pop bxiret;清屏,用空格符填满整个屏幕sub0: push espush dipush cxmov di,0b800hmov es,dimov di,0mov cx,2000b: mov byte ptr es:[di],' 'add di,2loop bpop cxpop dipop esret;设置前景色sub1: push dipush espush cxmov di,0b800hmov es,dimov di,1mov cx,2000c: and byte ptr es:[di],11111000bor es:[di],aladd di,2loop cpop cxpop espop diret;设置背景色sub2: push dipush espush cxmov di,0b800hmov es,dimov di,1mov cl,4shl al,clmov cx,2000d: and byte ptr es:[di],10001111bor es:[di],aladd di,2loop dpop cxpop espop diret;向上滚动24行,最后一行用空格符清楚sub3: push dspush espush sipush dipush cxmov si,0b800hmov ds,simov es,simov di,0mov si,160mov cx,24clde: push cxmov cx,160rep movsbpop cxloop emov cx,80mov di,160*24f: mov byte ptr es:[di],' 'add di,2loop fpop cxpop dipop sipop espop dsretint7chend: nopcode endsend start

汇编语言随笔(14)-直接定址表、检测点16和实验16相关推荐

  1. 汇编语言 第3版 王爽 检测点答案及详细解析

    第一章 基础知识 检测点1.1 (1)1个CPU的寻址能力为8KB,那么它的地址总线的宽度为 13位. (2)1KB的存储器有 1024 个存储单元,存储单元的编号从 0 到 1023 . (3)1K ...

  2. 《汇编语言》王爽(第四版) 第十六章 实验16

    文章目录 前言 一.实验任务 二.思路分析 1.程序框架 2.设置前景色 3.设置背景色 三.最终成果 1.完整代码 2.效果图 总结 前言 本文是王爽老师<汇编语言>(第四版) 第十六章 ...

  3. 直接定址表03 - 零基础入门学习汇编语言74

    第十六章:直接定址表03 让编程改变世界 Change the world by program 程序入口地址的直接定址表 我们看下面的问题: 实现一个子程序setscreen ,为显示输出提供如下功 ...

  4. 汇编语言随笔(15)- 对键盘输入进行处理(int 9 和 int 16h 中断例程)

    键盘输入 1,前面讲过, int 9 中断例程负责对键盘输入进行处理,具体为:从 60h 端口读出扫描码,并将其转化为相应的ASCII码或状态信息,一起存储到内存的指定空间(键盘缓冲区或状态字节)中. ...

  5. 直接定址表---汇编学习笔记

    直接定址表 16.1 描述了单元长度的标号 很简单,自己看. 检测点 16.1 下面的程序将code段中a处的8个数据累加,结果存储到b处的双字中,补全程序. assume cs:code code ...

  6. 汇编学习--7.16--直接定址表

    如何有效合理地组织数据,以及相关的编程技术. 描述了单元长度的标号 assume cs:code code segment a:db 1,2,3,4,5,6,7,8 b:dw 0 start:   m ...

  7. 汇编语言 第3版 王爽 检测点习题部分—答案及详细解析

    第一章 基础知识 检测点1.1 (1)1个CPU的寻址能力为8KB,那么它的地址总线的宽度为()位. (2)1KB的存储器有() 个存储单元,存储单元的编号从()到() . (3)1KB的存储器可以存 ...

  8. [汇编学习笔记][第十六章直接定址表]

    第十六章 直接定址表 16.1 描述了单元长度的标号 格式 code segmenta db 1,2,3,4,5,6,7,8,b dw 0 功能 此时标号a,b 不仅代表了内存单元,还代表了内存长度 ...

  9. 汇编访问计算机端口,汇编总结(2):中断、端口、直接定址表

    1.中断 CPU具有一种能力,可以在执行完当前指令之后,检测从内部产生或外部发来的特殊信息,并立即对其进行处理,这种特殊的信息,叫做中断信息. 中断即CPU不再接着刚执行完的指令向下执行,而是转去处理 ...

最新文章

  1. java IDE的四大金刚
  2. cannot open line '/dev/tty.usbserial' for r/w resource busy
  3. 状态模式在领域驱动设计中的使用
  4. fmdb和mysql的区别_FMDB
  5. # 解析bt文件_磁力链接和BT种子使用方法
  6. 论文解读:ACL2021 NER | 基于模板的BART命名实体识别
  7. Django_xamin注册model错误
  8. 位姿矩阵求逆 (搬运)
  9. mt4怎么用云服务器跟单,【MT4如何登陆观摩账户?MT4观摩账户怎么设置?】
  10. html网页表格线条设置,css怎么设置表格边框?
  11. 详解WAF与极风云WAF
  12. 计算两条线或多边形的交点(LineString | MultiLineString | Polygon )
  13. 空中交通通信控制设备的全球与中国市场2022-2028年:技术、参与者、趋势、市场规模及占有率研究报告
  14. 微信小程序导出zip、excel、word、png到手机
  15. 【官宣】顺丰同城宣布苏炳添出任首位品牌代言人,给你稳稳的幸福
  16. Java面向对象系列[v1.0.0][类加载器]
  17. 大学生应该做的18件事
  18. Logback 为日志配置颜色搭配(彩色搭配日志-搭配方案)
  19. jQuery俄罗斯方块游戏动画
  20. volatile 关键字详解

热门文章

  1. 用单循环链表实现约瑟夫问题。
  2. 试除法的妙用【O(√N) 复杂度】
  3. 编写一个求和函数sum,使输入sum(2)(3)或输入sum(2,3),输出结果都为5
  4. [转]Apache Commons IO入门教程
  5. Win10開始菜单打不开
  6. text-overflow
  7. python绘图课设_python课程设计笔记(三)turtle绘图库(海龟库)
  8. python webdriver点击指令_测开系列Selenium Webdriver Python(20)--Webdriver运行原理
  9. Win64 驱动内核编程-6.内核里操作注册表
  10. hdu1839 二分最短路