《汇编语言》总结04 —— 更灵活的定位内存地址的方法
(一)and和or指令
and指令:逻辑与指令,按位进行与运算
mov al,01100011B
and al,00111011B
执行后,al=00100011B
作用:通过该指令可将操作对象的相应位设为0,其他位不变。
or指令:逻辑或指令,按位进行或运算
mov al,01100011B
or al,00111011B
执行后:al=011111011B
作用:通过该指令可将操作对象的相应位设为1,其他位不变。
(二)关于ASCII码
世界上有很多编码方案,有一种方案叫做ASCII编码,是在计算机系统中通常被采用的。简单地说,所谓编码方案,就是一套规则,它约定了用什么样的信息来表示现实对象。比如说,在ASCII编码方案中,用61H表示“a”,62H表示“b”。一种规则需要人们遵守才有意义。
一个文本编辑过程中,就包含着按照ASCII编码规则进行的编码和解码。在文本编辑过程中,我们按一下键盘的a键,就会在屏幕上看到“a”。这是怎样一个过程呢?我们按下键盘的a键,这个按键的信息被送入计算机,计算机用ASCII码的规则对其进行编码,将其转化为61H存储在内存的指定空间中;文本编辑软件从内存中取出61H,将其送到显卡的显存中;工作在文本模式下的显卡,用ASCII码的规则解释显存中的内容,61H被当作字符“a”,显卡驱动显示器,将字符“a”的图像画在屏幕上。
(三)以字符形式给出的数据
我们可以在汇编程序中,用'...'的方式指明数据是以字符的形式给出的,编译器将把它们转化为相对应的ASCII码,如下:
assume cs:code,ds:data
data segment
db 'unIX'
db 'foRK'
data ends
code segment
start:mov al,'a'
mov bl,'b'
mov ax,4c00h
int 21h
code ends
end start
(四)大小写转换问题
assume cs:codesg,ds:datasg
datasg segment
db 'BaSiC'
db 'iNfOrMaTiOn'
datasg ends
codesg segment
start:mov ax,datasg
mov ds,ax ;设置ds指向datasg段
mov bx,0 ;设置(bx)=0,ds:bx指向'BaSiC'的第一个字母
mov cx,5 ;设置循环次数5,因为'BaSiC'有5个字母
s: mov al,[bx] ;将ASCII码从ds:bx所指向的单元中取出
add al,11011111B ;将al中的ASCII码的第5位置为0,变为大写字母
mov [bx],al ;将转变后的ASCII码写回原单元
inc bx ;(bx)加1,ds:bx指向下一个字母
loop s
mov bx,5 ;设置(bx)=5,ds:bx指向'iNfOrMaTiOn'的第一个字母
mov cx,11 ;设置循环次数11,因为'iNfOrMaTiOn'有11个字母
s0: mov al,[bx]
or al,00100000B ;将al中的ASCII码的第5位置为1,变为小写字母
mov [bx],al
inc bx
loop s0
mov ax,4c00h
int 21h
codesg ends
code start
(五)[bx+idata]
在前面总结中,我们用[bx]的方式来指明一个内存单元,还可以用一种更为灵活的方式来指明内存单元:[bx+idata]表示一个内存单元,它的偏移地址为(bx)+idata,比如:
mov ax,[bx+200]
数学化的描述为:(ax)=((ds)*16+(bx)+200)
也可以写为:
mov ax,[200+bx]
mov ax,200[bx]
mov ax,[bx].200
那这种方式有什么用呢?我们可以用[bx+idata]的方式进行数组的处理
assume cs:codesg,ds:datasg
datasg segment
db 'BaSiC'
db 'MinIX'
datasg ends
codesg segment
start:
codesg ends
end start
按照我们原来的方法,用[bx]的方式定位字符串中的字符。代码段如下:
mov ax,datasg
mov ds.ax
mov bx,0
mov cx,5
s:mov al,[bx]
and al,11011111B
mov [bx],al
inc bx
loop s
mov bx,5
mov cx,5
s0:mov al,[bx]
or al,00100000B
mov [bx],al
inc bx
loop s0
现在我们用[bx+idata]对上面的代码进行简化,如下:
mov ax,datasg
mov ds,ax
mov bx,0
mov cx,5
s:mov al,[bx]
and al,11011111B
mov [bx],al
mov al,[5+bx]
or al,00100000B
mov [5+bx],al
inc bx
loop s
但也可以写成下面这种:
mov ax,datasg
mov ds,ax
mov bx,0
mov cx,5
s:mov al,0[bx]
and al,11011111B
mov 0[bx],al
mov al,5[bx]
or al,00100000B
mov 5[bx],al
inc bx
loop s
如果我们用高级语言,比如C语言来描述上述程序,大致如下:
char a[5] = "BaSiC";
char b[5] = "MinIX";
main()
{int i;i = 0;do{a[i] = a[i] & 0xDF;b[i] = b[i] & 0x20;i++;}while(i < 5);
}
C语言:a[i],b[i]
汇编语言:0[bx],5[bx]
(六)SI和DI
si和di是8086CPU中和bx功能相近的寄存器,si和di不能够分成两个8位寄存器来使用
(七)[bx+si]和[bx+di]
[bx+si]和[bx+di]的含义相似,都表示一个内存单元,它的偏移地址为(bx)+(si)
mov ax,[bx+si]
数学化的描述为:(ax)=((ds)*16+(bx)+(si))
也可以写成如下格式:
mov ax,[bx][si]
(八)[bx+si+idata]和[bx+di+idata]
[bx+si+idata]和[bx+di+idata]含义相似,表示一个内存单元,它的偏移地址为(bx)+(si)+idata
mov ax,[bx+si+idata]
数学化的描述为:(ax)=((ds)*16+(bx)+(si)+idata)
该指令也可写成如下格式:
mov ax,[bx+200+si]
mov ax,[200+bx+si]
mov ax,200[bx][si]
mov ax,[bx].200[si]
mov ax,[bx][si].200
(九)不同的寻址方式的灵活应用
[idata]用一个常量来表示地址,可用于直接定位一个内存单元。
[bx]用一个变量来表示内存地址,可用于间接定位一个内存单元。
[bx+idata]用一个变量和一个常量表示内存地址,可在一个起始地址的基础上用变量间接定位一个内存单元。
[bx+si]用两个变量表示地址。
[bx+si+idata]用两个变量和一个常量表示地址。
总结完毕!
转载于:https://blog.51cto.com/liaofan/1918573
《汇编语言》总结04 —— 更灵活的定位内存地址的方法相关推荐
- 更灵活的定位内存地址的方法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 ...
- 更灵活的定位内存地址的方法---汇编学习笔记
更灵活的定位内存地址的方法 前面,我们用[0].[bx]的方法,在访问内存的指令中,定位内存单元的地址.本章将用更灵活的方式来定位内存地址. 7.1 and和or指令 (1)and指令:逻辑与指令,按 ...
- 汇编: 更灵活的定位内存地址的方法
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 这 ...
- 汇编语言-王爽 第7章 更灵活的定位内存地址的方法-笔记
将datasg中的第一个字符串转化为大写,第二个字符串转化为小写. 第一种方法: assume cs:codesg,ds:datasgdatasg segmentdb 'BaSic'db 'iNfOr ...
- 汇编语言-更灵活的定位内存地址的方法
目录 一.and和or指令 1.补充知识: 2.and指令 3.or指令 二.以字符的形式给出的数据 三.大小写转换 ACSII码值对照表: 一.and和or指令 1.补充知识: 与运算(&) ...
最新文章
- 二叉树的建立和遍历的各种问题
- 常见数据归一化的几种方法
- 个人博客代码_Solo小众开源博客系统:手把手教你搭建自己的博客系统
- 搜索引擎学习(七)解析查询
- Web UI 用户管理部分 Bug报告
- 写一个Android输入法01——最简步骤
- mac svn工具_Cornerstone 4 for mac(svn管理工具)
- matlab双目相机标定校正_基于双目视觉的无人机避障算法(一)
- PHP 加密用户密码 How to store passwords safely with PHP and MySQL
- Android中的webview详细使用
- 计算机关机键消失了,如何解决Windows7电脑中的关机键不见了
- python之slice,range
- LREC'22 | 机器翻译中细粒度领域自适应的数据集和基准实验
- 向量的表示及协方差矩阵
- storm 使用外部配置文件提交拓扑
- android 动画中插值器Interpolator详解
- 华为设备MSTP配置命令
- 计算机复制无法到qq上,为什么不能复制粘贴,解决电脑无法粘贴复制的方法
- 应用 1:千帆竞发 ——分布式锁
- 微信开发生成测试签名--signature,并使用微信jssdk获取位置
热门文章
- k折交叉验证优缺点_K最近邻(KNN)算法
- 计算机开机和关机的音乐,电脑开关机音乐设置
- android listview动态添加viewpager,请教大神,android如何在viewpager里添加listview,谢谢啦...
- android person类_es5 类与es6中class的区别小结_javascript技巧
- linux eclipse 权限不够,linux下启动eclipse 权限不够 错误解决办法
- oracle 百万数据存储,jdbc oracle 百万级数据量存储
- 怎么在服务器添加充值网站,云服务器怎么弄充值
- linux centos ppp限速,Centos7限速和测速
- 如何让CSS动画中途停止并维持姿态
- python微控制器编程从零开始 pdf_Python极客项目编程_(美)Mahesh Venkitachalam.pdf