【汇编】更灵活的定位内存地址方式——and,or命令、SI、DI变址寄存器、直接寻址[idata]、寄存器间接寻址[bx]、寄存器相对寻址[bx+idata]、基址变址寻址、相对基址变址寻址
更灵活的定位内存地址方式
- 7.1 and和or命令
- 解决大小写转换问题
- [bx+idata]的含义
- 7.2 SI和DI
- [bx+si]和[bx+di]方式指定地址(基址+变址寻址)
- [bx+si+idata]和[bx+di+idata]方式指定地址
- 不同寻址方式的灵活运用
7.1 and和or命令
db ‘.......’
方式给出字符串,并将其以ASCII码的对应形式写入内存中。
在ASCII码中大小写同字母之间相差32个序号,所以可以通过与11011111b
即二进制的数据,来转换大写,或00100000b
,来转换小写。即加减32位的数值变换大小写。
解决大小写转换问题
大小写转换要通过初始化bx和循环次数,在循环中通过与或操作进行大小写转换。
代码如下:
通过两次循环实现大小写转换
assume cs:codesg,ds:datasg
datasg segmentdb 'BaSiC'db 'MinIX'
datasg endscodesg segment
start:mov ax,datasgmov ds,axmov bx,0mov cx,5
s: mov al,[bx]and al,11011111bmov [bx],alinc bxloop smov bx,5mov cx,5
s0: mov al,[bx]or al,00100000bmov [bx],alinc bxloop s0mov ax,4C00Hint 21Hcodesg endsend start
[bx+idata]的含义
通过单次循环[bx+idata]解决大小写转换
assume cs:codesg,ds:datasg
datasg segmentdb 'BaSiC'db 'MinIX'
datasg endscodesg segment
start:mov ax,datasgmov ds,axmov bx,0mov cx,5
s: mov al,[bx]and al,11011111bmov [bx],almov al,[bx+5]or al,00100000bmov [bx+5],alinc bxloop smov ax,4C00Hint 21Hcodesg endsend start
7.2 SI和DI
SI,DI称为变址寄存器。
其特点就是不能分为两个八位寄存器来使用。一直都是16位。
[bx+si]和[bx+di]方式指定地址(基址+变址寻址)
[bx+si+idata]和[bx+di+idata]方式指定地址
不同寻址方式的灵活运用
直接寻址:通过一个常量数字来表示一个地址。
寄存器间接寻址:用一个变量[bx]表示偏移地址,存入寄存器中再传给ax。
寄存器相对寻址:通过用一个起始地址的常量[idata]来加上变量[bx]来间接表示内存单元。
基址变址寻址:用两个 变量[bx+si] 表示地址。
相对基址变址寻址:用两个变量[bx+si]一个 常量[idata] 来表示地址。
assume cs:codesg,ds:datasg
datasg segmentdb '1. file 'db '2. edit 'db '3. search 'db '4. view 'db '5. options '
datasg endscodesg segment
start:mov ax,datasgmov ds,axmov bx,0mov cx,5
s: mov al,[bx+3]and al,11011111bmov [bx+3],aladd bx,16loop smov ax,4C00Hint 21Hcodesg endsend start
上面这段代码有个问题,那就是cx只有一个,到第二个循环内出来时,cx已经变为0了,那再出外层循环时,cx不是成为负数了么?我们要怎么改进呢?
我们可以通过一个多余的寄存器dx来保存。
但是如果dx已经被用了呢?寄存器可是只有14个。
相对而言我们可以用固定的内存空间保存数据,这样相较而言比占用宝贵的寄存器资源要更加划算,但是这样也有一个新问题,那就是如果当时内存空间有别的内容,可能最终会改变别的功能,造成一些后果。
再改进的话我们可以在程序运行前先定义一个栈段,把需要用到的cx的值压到栈段中,用到的时候将其弹出,回复cx。
【汇编】更灵活的定位内存地址方式——and,or命令、SI、DI变址寄存器、直接寻址[idata]、寄存器间接寻址[bx]、寄存器相对寻址[bx+idata]、基址变址寻址、相对基址变址寻址相关推荐
- 汇编: 更灵活的定位内存地址的方法
bx是偏移地址寄存器.同样的, si,di也是偏移地址寄存器. 这样使用了si,di可以更灵活的定位内存地址. assume cs:codecode segmentstart: mov bx,0mov ...
- 更灵活的定位内存地址的方法---汇编学习笔记
更灵活的定位内存地址的方法 前面,我们用[0].[bx]的方法,在访问内存的指令中,定位内存单元的地址.本章将用更灵活的方式来定位内存地址. 7.1 and和or指令 (1)and指令:逻辑与指令,按 ...
- 汇编程序-更灵活的定位内存地址方法
汇编程序-更灵活的定位内存地址方法 如何灵活运用定位内存的方法呢?在之后,我们将列出几个实际例子.通过例子,展示定位内存的一些方法,熟悉和提升我们对汇编程序的理解. 大小写转化(1) 通过上面的汇编程 ...
- 更灵活的定位内存地址的方法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 ...
- [汇编语言]更灵活的定位内存地址的方法
目录 一.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 ...
最新文章
- python中while嵌套循环_python中的while循环
- 动态路由协议RIP的基本原理与配置
- 自学python需要下载什么软件-学python下载什么软件开发
- 作为项目的直接上级通过问题和风险来帮助项目
- MFC中关于虚函数的一些问题
- 前端学习(1849)vue之电商管理系统电商系统前端项目初始化
- java软尾山地车评测_[渣图] 骑很慢的穷屌丝软尾历程
- 在做模具设计过程中应注意哪些问题
- 雨棚板弹性法计算简图_雨棚板的计算书
- vue2中vant实现网易云音乐案例-附带所有源码
- Process Hacker 简单介绍
- Pinia(小菠萝)使用方法
- App关键字(100字符)优化的方法
- [观点]AppStore支持人民币支付对国内开发者的影响
- DNS Glue Record 测试、查找
- 标星 2.7w+ 堪称史上最全的微信小程序开发资源汇总
- HTTP请求错误码大全
- Cena win8/win10配置
- 计算机比特有大小吗,比特大小-
比特犬一般能长多大
- 美国的教科书价格为什么这么高