汇编程序-更灵活的定位内存地址方法

如何灵活运用定位内存的方法呢?在之后,我们将列出几个实际例子。通过例子,展示定位内存的一些方法,熟悉和提升我们对汇编程序的理解。

大小写转化(1)

通过上面的汇编程序,我们完成了将data段中存放的『basIc』转化为了『BASIC』,将『MinIX』转化为了『minix』

assume cs:codedata segmentdb 'basIc'db 'MinIX'
data endscode segment start:  mov ax,datamov ds,axmov bx,0mov si,0    ;表示起始位置,这里起始位置为0;观察ASCII码表,对比大小写字母的二进制形式,;发现除了第5位外,大写小字母的其他各个位数都是一样的。;大写字母的第5位为0,小写字母的第5位为1。;因此,转化大小写,只要对第5位数进行逻辑运算即可mov cx,5
s:  mov al,[si+bx]and al,11011111Bmov [bx],almov al,[si+5+bx]or al,00100000Bmov [5+bx],alinc bx
loop smov ax,4c00Hint 21Hcode endsend start

如图:

知识点

  1. and表示逻辑与运算。

    mov al,10101100B
    and al,11011111B//结果 al = 10001100B
  2. or表示逻辑或运算。

    mov al,10001100B
    or  al,00100000B//结果 al = 10101100B
  3. db ‘……’为以字符的形式给出数据。编辑器讲他们转化为相对应的ASCII码,一个单词为一个字节大小。

  4. [idata+bx]

    在前面,我们用[bx]的方式来指明一个内存单元,还可以用一种更为灵活的方式来指明内存单元:[idea+bx]表示一个内存单元,他的偏移地址为(bx)+idata(bx中的数值加上idata)。

    常用格式:

    mov ax,[200+bx]
    mov ax,200[bx]//模拟高级语言写法(类似于c语言中的a[10])
    mov ax,[200].bx//模拟高级语言写法
  5. si,di寄存器
    si,di是和bx功能相近的寄存器。下面展示了几种使用方法:

    • mov ax,[si] /mov ax,[bi]
    • mov ax,[bx][si] / mov ax,[bx][bi]
    • mov ax,[bx+si+10]/ mov ax,200[bx][si]/ mov ax,[bx].200[si]/ mov ax,bx[si].200

大小写转化(2)

通过下面的汇编程序,我们完成了将data段中存放的4条字符串中的小写字母转化为了大写字母

assume cs:code, ds:data, ss:stackdata segmentdb 'ibm             '   db 'dec             'db 'vox             'db 'vax             '
data endsstack segmentdw 0,0
stack endscode segmentstart:mov ax,stackmov ss,axmov sp,16mov ax,datamov ds,axmov bx,0mov cx,4s0: push cxmov si,0mov cx,3s:  mov al,[bx+si]and al,11011111Bmov [bx+si],alinc siloop sadd bx,16pop cx
loop s0mov ax,4c00Hint 21Hcode endsend start   code endsend start

如图:

知识点

  1. 通过栈来存放数据

    例如:上面程序中进行了嵌套循环,但是技术寄存器cx只有一个。怎么做到将cx存储一分为二使用呢?我们可以通过栈来将cx中的数据存储到内存单元中。外层循环中,我们通过cx来进行循环计数;在进入内层loop之前,将外层的loop中的cx,push存放起来,再重新设置cx,进行内部loop;当内层loop完毕,通过pop将cx中的数取出来,继续外部loop中的操作。

  2. 循环嵌套

    s0: push cx...s:  mov al,[bx+si].........loop spop cx
    loop s0

大小写转化(3)

'1. display      '
'2. brows        '
'3. replace      '
'4. modify       '

将上面4个字符串中的小写单词转化为大写单词。

代码如下

assume cs:code, ds:data, ss:stackdata segmentdb '1. display      '   db '2. brows        'db '3. replace      'db '4. modify       '
data endsstack segmentdw 0,0
stack endscode segmentstart:  mov ax,stackmov ss,axmov sp,10Hmov ax,6Hpush axmov ax,7Hpush axmov ax,5Hpush axmov ax,7Hpush axmov ax,datamov ds,axmov bx,3Hmov si,0Hmov cx,4H
s1: mov dx,cxpop cxpush dxmov si,0Hs2: mov al,[bx+si]and al,11011111Bmov [bx+si],alinc siloop s2add bx,10Hpop cx
loop s1mov ax,4c00Hint 21H
code ends
end start

效果图

转载于:https://www.cnblogs.com/AbeDay/p/5026856.html

汇编程序-更灵活的定位内存地址方法相关推荐

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

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

  2. 更灵活的定位内存地址的方法---汇编学习笔记

    更灵活的定位内存地址的方法 前面,我们用[0].[bx]的方法,在访问内存的指令中,定位内存单元的地址.本章将用更灵活的方式来定位内存地址. 7.1 and和or指令 (1)and指令:逻辑与指令,按 ...

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

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

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

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

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

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

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

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

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

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

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

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

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

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

最新文章

  1. [vb+mo] visual baisc 6.0 基于mapobjects 2.4 开发的数字化校园电子地图
  2. niosII EDS和QuartusII安装心得体会
  3. Linux动态链接库的使用
  4. linux网络协议栈之数据包处理过程,Linux网络协议栈之数据包处理过程
  5. 大数据视觉智能实践及医学影像智能诊断探索(讲座精华笔记)
  6. [译]WPF开源控件扩展库ControlzEx
  7. 本地线程分配缓冲_线程本地分配缓冲区
  8. fasttext 文本分类_4种常见的NLP实践思路【特征提取+分类模型】
  9. PyTorch框架学习一——PyTorch的安装(CPU版本)
  10. java事件绑定,Java编程GUI中的事件绑定代码示例
  11. Java并发编程实战————售票问题
  12. Elasticsearch性能监控(一)
  13. 前端编码规范之JavaScript
  14. 学习笔记 十一 : iscsi
  15. 案例-旋转木马(CSS3)
  16. linux 检查文件更新,Linux系统文件系统优化及磁盘检查
  17. Blend 混合模式
  18. jpa 人大金仓数据库方言_人大金仓+springboot配置
  19. 利用Python创建Excel条形图
  20. 按键精灵电脑版对接百度ai,告别字库(文字识别篇)

热门文章

  1. python中的float和eval_python中eval和float_python中eval与json.loads对json的处理
  2. 搜索引擎蜘蛛抓取主要依据用户的四种行为
  3. c 语言 循环队列,循环队列C语言
  4. oracle 11gr2 单机数据库使用asm,RHEL7上安装11gR2单机使用ASM存储搭建Physical Standby笔记...
  5. ios 圆形旋转菜单_iOS高级动画:圆形树展开收起动画
  6. java 集合自定义元素_java集合 collection-list-ArrayList 将自定义对象作为元素存到ArrayList集合中,并去除重复元素。...
  7. 开发日记-20190918 关键词 努力
  8. 开发日记-20190417 关键词 代码之间耦合度的一刀两断 (思路篇)
  9. SIMD指令集——一条指令操作多个数,SSE,AVX都是,例如:乘累加,Shuffle等
  10. cassandra 集群并发测试脚本