更灵活的定位内存地址的方法

前面,我们用[0]、[bx]的方法,在访问内存的指令中,定位内存单元的地址。本章将用更灵活的方式来定位内存地址。


7.1 and和or指令

(1)and指令:逻辑与指令,按位进行与运算。例如:

mov al,01100011B
and al,00111011B
;执行后:al = 00100011B

(2)or指令:逻辑或指令,按位进行或运算。例如:

mov al,01100011B
or al,00111011B
;执行后:al = 01111011B

7.2 关于ASCII码


7.3 以字符形式给出的数据

‘……’的方式指明数据是以字符的形式给出,编译器将它们转化为相应的ASCII码。如下:

assume cs:code,ds:data
data segmentdb 'unIX'   ;相当于 db 75H,6EH,49H,58Hdb 'foRK'   ;同理,下面的也是
data endscode segment
start:  mov al,'a'mov bl,'b'mov ax,4c00hint 21h
code ends
end start

debug运行查看是否:

先用r命令分析一下data段的地址,因“ds=075A”,所以程序从076AH段开始,data段又是程序中的第一个段,它就在程序的起始处,所以它的段地址为0B3DH


7.4 大小写转换的问题

考虑这样一个问题,在codesg中填写代码,将datasg中的第一个字符串转化为大写,第二个字符串转化为小写。

assume cs:codesg,ds:datasg
datasg segmentdb 'BaSic'db 'iNfOrMaTiOn'
datasg ends
codesg segmentstart:
codesg ends
ends start

主要问题是怎么判断一个字母是大写还是小写?不过我们好像没有学过如何判断一个字母大小写的指令。所以该怎么办呢?

我们观察发现,ASCII码的二进制形式有一个规律!如下:

因此,我们可以用刚刚学过的and和or来做这个实验!这里指出方法:
变成大写:只要and al,11011111B
变成小写:只要or al,00100000B


7.5 [bx+idata]

指令mov ax,[bx+200]中的[bx+200]数学化的描述:(ax) = ((ds)*16+(bx)+200)。

问题 7.1
用Debug查看内存,结果如下:
2000:1000 BE 00 06 00 00 00 …
写出下面的程序执行后,ax、bx、cx中的内容。

mov ax,2000H    ;ax=2000h
mov ds,ax       ;ds=2000h
mov bx,1000H    ;bx=1000h
mov ax,[bx]     ;ax=00BEh
mov cx,[bx+1]   ;cx=0600h
add cx,[bx+2]   ;cx=0606h

7.6 用[bx+idata]的方式进行数组的处理

我们经常用的一个策略,这里直接略过吧!


7.7 SI和DI

si和di是8086CPU中和bx功能相近的寄存器,si和di不能够分成两个8位寄存器来使用

下面3组实现了相同的功能:

;第一组
mov bx,0
mov ax,[bx]
mov ax,[bx+123];第二组
mov si,0
mov ax,[si]
mov ax,[si+123];第三组
mov di,0
mov ax,[di]
mov ax,[di+123]

问题 7.2
用si和di实现字符串’welcome to masm!’复制到它后面的数据区中。

assume cs:codesg,ds:datasg
datasg segmentdb 'welcome to masm!'db '................'
datasg ends

代码段(答案):

codesg segmentstart:  mov ax,datasgmov ds,axmov si,0mov di,10hmov cx,8s:  mov ax,[si]mov [di],axadd si,2add di,2loop smov ax,4c00hint 21hcodesg ends
end start

问题 7.3
用更少的代码,实现问题7.2的程序
答案如下:

codesg segmentstart:  mov ax,datasgmov ds,axmov si,0mov cx,8s:  mov ax,[si]mov [si+16],axadd si,2loop smov ax,4c00hint 21hcodesg ends
end start

7.8 [bx+si]和[bx+di]

指令mov ax,[bx+si]中的[bx+si]数学化的描述:(ax) = ((ds)*16+(bx)+(si))。

问题 7.4
用Debug查看内存,结果如下:
2000:1000 BE 00 06 00 00 00 …
写出下面的程序执行后,ax、bx、cx中的内容。

mov ax,2000h    ;ax=2000h
mov ds,ax       ;ds=2000h
mov bx,1000h    ;bx=1000h
mov si,0        ;si=0h
mov ax,[bx+si]  ;ax=00beh
inc si          ;si=1h
mov cx,[bx+si]  ;cx=0600h
inc si          ;si=2h
mov di,si       ;di=2h
add cx,[bx+di]  ;cx=0606h

7.9 [bx+si+idata]和[bx+di+idata]

指令mov ax,[bx+si+idata]中的[bx+si+idata]数学化的描述:(ax) = ((ds)*16+(bx)+(si)+(idata))。

问题 7.5
用Debug查看内存,结果如下:
2000:1000 BE 00 06 00 6A 22 …
写出下面的程序执行后,ax、bx、cx中的内容。

mov ax,2000h        ;ax=2000h
mov ds,ax           ;ds=2000h
mov bx,1000h        ;bx=1000h
mov si,0            ;si=0h
mov ax,[bx+2+si]    ;ax=0006h
inc si              ;si=1h
mov cx,[bx+2+si]    ;cx=6a00h
inc si              ;si=2h
mov di,si           ;di=2h
mov bx,[bx+2+di]    ;bx=226ah

7.10 不同的寻址方式的灵活应用

(1)[idata]用一个变量来表示地址,可用于直接定位一个内存单元。
(2)[bx]用一个变量来表示内存地址,可用于间接定位一个内存单元。
(3)[bx+idata]用一个变量和常量表示地址,可在一个起始地址的基础上用变量间接定位一个内存单元。
(4)[bx+si]用两个变量表示地址。
(5)[bx+si+idata]用两个变量和一个常量表示地址。

问题 7.6
编程,将datasg段中每个单词的头一个字母改为大写字母。

assume cs:codesg,ds:datasg
datasg segmentdb '1. file         'db '2. edit         'db '3. search       'db '4. view         'db '5. options      'db '6. help         '
datasg segmentcodesg segmentstart:;答案如下:mov ax,datasgmov ds,axmov bx,0mov cx,6s:mov al,[bx+3]and al,11011111Bmov [bx+3],aladd bx,10hloop smov ax,4c00hint 21h
codesg ends
end start

问题 7.7
编程,将datasg段中每个单词改为大写字母。

assume cs:codesg,ds:datasg
datasg segmentdb 'ibm             'db 'dec             'db 'dos             'db 'vax             '
datasg endscodesg segmentstart:;答案如下:mov ax,datasgmov ds,axmov bx,0mov cx,4s:mov dx,cxmov si,0mov cx,3s0:mov al,[bx+si]and al,11011111bmov [bx+si],alinc siloop s0add bx,10hmov cx,dxloop smov ax,4c00hint 21h
codesg ends
end start

其实,我们这里存cx应该需要用栈来存储。这是我们常用的方法,也是递归的本质

如下:

assume cs:codesg,ss:stacksg,ds:datasg
;增加了栈空间
stacksg segmentdw 0,0,0,0,0,0,0,0
stacksg endsdatasg segmentdb 'ibm             'db 'dec             'db 'dos             'db 'vax             '
datasg endscodesg segmentstart:;答案如下:mov ax,datasgmov ds,axmov bx,0mov cx,4s:push cx    ;这里改变了mov si,0mov cx,3s0:mov al,[bx+si]and al,11011111bmov [bx+si],alinc siloop s0add bx,10hpop cx    ;这里也改变了loop smov ax,4c00hint 21h
codesg ends
end start

总结

这一章,我们主要学习了寻址方式:

  1. 寻址方式[bx(或 si、di)+idata]、[bx+si(或 di)]、[bx+si(或 di)+idata]的意义和应用。
  2. 二重循环问题的处理
  3. 栈的应用
  4. 大小写转化的方法
  5. and、or指令

实验6 实践课程中的程序

(1)将课程中所有讲解过的程序上机调试,用Debug跟踪其执行过程,并在过程中进一步理解所讲内容。
(2)编程,完成问题7.9中的程序。将下面datasg段的每个单词的前4个字母改为大写!

assume cs:codesg,ss:stacksg,ds:datasgstacksg segmentdw 0,0,0,0,0,0,0,0
stacksg endsdatasg segmentdb '1. display      'db '2. brows        'db '3. replace      'db '4. modify       '
datasg endscodesg segmentstart:mov ax,datasgmov ds,axmov bx,0mov cx,4s:  push cxmov si,0mov cx,4s0:mov al,[bx+si+3]and al,11011111bmov [bx+si+3],alinc siloop s0add bx,16pop cxloop smov ax,4c00hint 21h
codesg ends
end start

实验结果如下:

更灵活的定位内存地址的方法---汇编学习笔记相关推荐

  1. 更灵活的定位内存地址的方法02 - 零基础入门学习汇编语言33

    第七章:更灵活的定位内存地址的方法02 让编程改变世界 Change the world by program [bx+idata] 在前面,我们可以用[bx]的方式来指明一个内存单元, 我们还可以用 ...

  2. 更灵活的定位内存地址的方法05 - 零基础入门学习汇编语言36

    第七章:更灵活的定位内存地址的方法05 让编程改变世界 Change the world by program 问题7.8 [codesyntax lang="asm"] assu ...

  3. 汇编: 更灵活的定位内存地址的方法

    bx是偏移地址寄存器.同样的, si,di也是偏移地址寄存器. 这样使用了si,di可以更灵活的定位内存地址. assume cs:codecode segmentstart: mov bx,0mov ...

  4. [汇编语言]更灵活的定位内存地址的方法

    目录 一.and和or指令 二.以字符的形式给出数据 三.大小写转化问题 四.[bx+idata] 五.SI和DI 六.[bx+si]和[bx+di] 与 [bx+si+idata]和[bx+di+i ...

  5. (七)汇编语言——更灵活的定位内存地址的方法

    目录 and和or ASCII码 [bx+idata] SI和DI寄存器 [bx+si]和[bx+di] [bx+si+idata]和[bx+di+idata] 总结 例子(双重循环的解决方案) 我们 ...

  6. 王爽 汇编语言第三版 第7章 --- 更灵活的定位内存地址的方法(可以理解为 数组形式的内存定位)

    汇编语言(第三版)王爽著 的十二个实验:https://blog.csdn.net/OrangeHap/article/details/89791064 大小端 字节对齐 对于 arm,intel 这 ...

  7. 《汇编语言》总结04 —— 更灵活的定位内存地址的方法

    (一)and和or指令 and指令:逻辑与指令,按位进行与运算 mov al,01100011B and al,00111011B 执行后,al=00100011B 作用:通过该指令可将操作对象的相应 ...

  8. 汇编语言-王爽 第7章 更灵活的定位内存地址的方法-笔记

    将datasg中的第一个字符串转化为大写,第二个字符串转化为小写. 第一种方法: assume cs:codesg,ds:datasgdatasg segmentdb 'BaSic'db 'iNfOr ...

  9. 汇编语言-更灵活的定位内存地址的方法

    目录 一.and和or指令 1.补充知识: 2.and指令 3.or指令 二.以字符的形式给出的数据 三.大小写转换 ACSII码值对照表: 一.and和or指令 1.补充知识: 与运算(&) ...

最新文章

  1. Angular 8.0.0-beta.5 发布,Web 前端框架
  2. 创建个人网站所需php书籍,PHP个人网站架设连环讲(三)
  3. mac python3 安装mysqlclient
  4. 古典概型中的几何体计数
  5. centos6.5下安装gradle编译环境
  6. pta 习题集 5-2 找出不是两个数组共有的元素 (5分)
  7. div css将文字居中显示图片,css文字居中、图片居中、div居中解决方案
  8. xg push sdk android,AppCan文档中心-uexXGPush
  9. DreamWeaver插件–Javascript文件美化、自动缩进
  10. 用visio制作机柜服务器,visio 绘制机柜接线图 实例教程
  11. 订阅号做微信登录php,Thinkphp5实现微信登录
  12. 《互联网周刊》:华为终端的未来之路
  13. 最新计算机专业毕业设计论文选题源码演示录像下载(开题报告任务书PPT毕业答辩模板 jsp70786体育馆售票门票系统 双数据库 mysql版
  14. 世界三大顶级音响_世界十大名牌音响有那些
  15. 苹果手机账号验证失败连接不上服务器,Apple ID登录连接服务器验证失败怎么解决?...
  16. 加权平均np.average()
  17. 技术族谱:预告片的制作思路
  18. python爬房源信息_Python爬取链家二手房源信息
  19. 如何让计算机停止打印,电脑打印提示print Splooer停止无法使用怎么办
  20. HTTP 所有状态码

热门文章

  1. css实现超出文本溢出用省略号代替
  2. CSE 5/7350 – Project
  3. 使用Vue.js初次真正项目开发-2018/07/14
  4. easyui from 缓存问题处理
  5. SMACH专题(一)----安装与初探
  6. 免费素材下载:Box Of Bundles Number 2
  7. summary+plan
  8. 编程方法学23:搜索排序与算法效率分析
  9. Win7如何设置多个IP地址
  10. Python 中的Pyc文件