更灵活的定位内存地址的方法---汇编学习笔记
更灵活的定位内存地址的方法
前面,我们用[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
总结
这一章,我们主要学习了寻址方式:
- 寻址方式[bx(或 si、di)+idata]、[bx+si(或 di)]、[bx+si(或 di)+idata]的意义和应用。
- 二重循环问题的处理
- 栈的应用
- 大小写转化的方法
- 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
实验结果如下:
更灵活的定位内存地址的方法---汇编学习笔记相关推荐
- 更灵活的定位内存地址的方法02 - 零基础入门学习汇编语言33
第七章:更灵活的定位内存地址的方法02 让编程改变世界 Change the world by program [bx+idata] 在前面,我们可以用[bx]的方式来指明一个内存单元, 我们还可以用 ...
- 更灵活的定位内存地址的方法05 - 零基础入门学习汇编语言36
第七章:更灵活的定位内存地址的方法05 让编程改变世界 Change the world by program 问题7.8 [codesyntax lang="asm"] assu ...
- 汇编: 更灵活的定位内存地址的方法
bx是偏移地址寄存器.同样的, si,di也是偏移地址寄存器. 这样使用了si,di可以更灵活的定位内存地址. assume cs:codecode segmentstart: mov bx,0mov ...
- [汇编语言]更灵活的定位内存地址的方法
目录 一.and和or指令 二.以字符的形式给出数据 三.大小写转化问题 四.[bx+idata] 五.SI和DI 六.[bx+si]和[bx+di] 与 [bx+si+idata]和[bx+di+i ...
- (七)汇编语言——更灵活的定位内存地址的方法
目录 and和or ASCII码 [bx+idata] SI和DI寄存器 [bx+si]和[bx+di] [bx+si+idata]和[bx+di+idata] 总结 例子(双重循环的解决方案) 我们 ...
- 王爽 汇编语言第三版 第7章 --- 更灵活的定位内存地址的方法(可以理解为 数组形式的内存定位)
汇编语言(第三版)王爽著 的十二个实验:https://blog.csdn.net/OrangeHap/article/details/89791064 大小端 字节对齐 对于 arm,intel 这 ...
- 《汇编语言》总结04 —— 更灵活的定位内存地址的方法
(一)and和or指令 and指令:逻辑与指令,按位进行与运算 mov al,01100011B and al,00111011B 执行后,al=00100011B 作用:通过该指令可将操作对象的相应 ...
- 汇编语言-王爽 第7章 更灵活的定位内存地址的方法-笔记
将datasg中的第一个字符串转化为大写,第二个字符串转化为小写. 第一种方法: assume cs:codesg,ds:datasgdatasg segmentdb 'BaSic'db 'iNfOr ...
- 汇编语言-更灵活的定位内存地址的方法
目录 一.and和or指令 1.补充知识: 2.and指令 3.or指令 二.以字符的形式给出的数据 三.大小写转换 ACSII码值对照表: 一.and和or指令 1.补充知识: 与运算(&) ...
最新文章
- Angular 8.0.0-beta.5 发布,Web 前端框架
- 创建个人网站所需php书籍,PHP个人网站架设连环讲(三)
- mac python3 安装mysqlclient
- 古典概型中的几何体计数
- centos6.5下安装gradle编译环境
- pta 习题集 5-2 找出不是两个数组共有的元素 (5分)
- div css将文字居中显示图片,css文字居中、图片居中、div居中解决方案
- xg push sdk android,AppCan文档中心-uexXGPush
- DreamWeaver插件–Javascript文件美化、自动缩进
- 用visio制作机柜服务器,visio 绘制机柜接线图 实例教程
- 订阅号做微信登录php,Thinkphp5实现微信登录
- 《互联网周刊》:华为终端的未来之路
- 最新计算机专业毕业设计论文选题源码演示录像下载(开题报告任务书PPT毕业答辩模板 jsp70786体育馆售票门票系统 双数据库 mysql版
- 世界三大顶级音响_世界十大名牌音响有那些
- 苹果手机账号验证失败连接不上服务器,Apple ID登录连接服务器验证失败怎么解决?...
- 加权平均np.average()
- 技术族谱:预告片的制作思路
- python爬房源信息_Python爬取链家二手房源信息
- 如何让计算机停止打印,电脑打印提示print Splooer停止无法使用怎么办
- HTTP 所有状态码