[bx+idata]也就是[bx+数字]
如:ds:[bx+5]
指令mov ax,[bx+200]的含义
将一个内存单元的内容送入ax,这个内存单元的长度为两个字节,存放一个字,偏移地址为bx中的数值加上200,段地址在ds中。
数学表示:(ax)=((ds)*16+(bx)+200)
该指令也可以写成如下格式(常用):
mov ax,[200+bx]
mov ax,200[bx]
mov ax,[bx].200

题目:编写代码,将datasg定义中的第一个字符转化为大写,第二个字符转化为小写:

方法1:按照原来的方法,用[BX]的方式定位字符串中的字符

;编写代码,将datasg定义中的第一个字符转化为大写,第二个字符转化为小写
assume cs:codesg,ds:datasgdatasg segmentdb 'BaSiC'db 'MinIX'
datasg endscodesg segment
;按照原来的方法,用[BX]的方式定位字符串中的字符
start:mov ax,datasgmov ds,axmov bx,0mov cx,5
upLetter:mov al,ds:[bx]and al,11011111B;小写变大写(将al的第五位变成0)mov ds:[bx],alinc bxloop upLettermov bx,5mov cx,5
downLetter:mov al,ds:[bx]or al,00100000B;大写变小写(将al的第五位变成1)mov ds:[bx],alinc bxloop downLettermov ax,4c00hint 21hcodesg ends
end start

方法2:有了【bx+idata】的方式可以变得更简化

思路:观察datasg段中的两个字符串,一个起始地址为0,另一个起始地址为5.
我们可以将这两个字符串看成两个数组,一个从0地址开始存放,一个从5开始
那么,我们就可以用[0+bx]和[5+bx]的方式在同一个循环中定位这两个字符串中的字符。
在这里,0和5给定了两个字符串的起始偏移地址,bx中给出了从起始偏移地址开始的相对地址。
这两个字符串在内存中的起始地址是不一样的,但是,他们中的每一个字符,从起始地址开始的相对地址的变化是相同的。

;编写代码,将datasg定义中的第一个字符转化为大写,第二个字符转化为小写
assume cs:codesg,ds:datasgdatasg segmentdb 'BaSiC'db 'MinIX'
datasg endscodesg segment
;按照新的方法,用[BX+数字]的方式定位字符串中的字符
start:mov ax,datasgmov ds,axmov bx,0mov cx,5changeLetter:mov al,[bx]  ;定位第一个字符串中的字符and al,11011111bmov [bx],almov al,[5+bx];定位第二个字符串中的字符or [5+bx],alinc bxloop changeLettermov ax,4c00hint 21hcodesg ends
end start

比较C程序和汇编程序的相似之处:
C语言:a[i] , b[i]
汇编语言:0[bx] , 5[bx]
通过比较可以发现,[bx+idata]的方式为高级语言实现数组提供了便利机制。

用[bx+idata]的方式进行数组的处理相关推荐

  1. c51汇编语言读写idata,汇编语言用[bx+idata]的方式进行数组的处理

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

  2. [汇编语言]用[bx+idata]的方式进行数组的处理-字母大小写转换

    第一个字符串"BaSiC"中的小写字母变成大写字母: 第二个字符串"iNfOrMaTiOn"中的大写字母变成小写字母: 方法一: 代码如下: assume cs ...

  3. 汇编语言中寻址方式[bx + idata]

    [bx + idata]含义: 用于灵活的表示内存单元,[bx + idata] 的方式为高级语言实现数组提供了遍历机制. 数学化描述 :(ax) = ((da)*16 + (bx) + 200) 物 ...

  4. 贺利坚老师汇编课程33笔记:[bx+idata]对同长度字符串进行同步处理

    指路老师博客 对两个同长度字符串同步操作,具体分析可以看上一篇 代码 assume cs:codesg,ds:datasg datasg segmentdb 'BaSiC'db 'MinIX';长度一 ...

  5. 汇编[bx+idata](8086)

    [bx+idata]表示一个内存单元,它的偏移地址的值就是bx+idata 对于指令: mov ax,[bx+200] 将偏移地址为bx+200的内存单元送到ax中,段地址存放在ds中,当cpu执行这 ...

  6. 内存地址[bx+idata]、[bx+si/di]、[bx+si/di+idata]的灵活定位

    内存地址[bx+idata].[bx+si/di].[bx+si/di+idata]的灵活定位 一. 实验目的 二.实验内容 三. 实验步骤 四. 结果 五. 心得体会 一. 实验目的 1. 掌握an ...

  7. 创建一个二维数组,以4行4列左对齐的方式将数组输出

    创建一个二维数组,以4行4列左对齐的方式将数组输出 package p1;public class Java_2{public static void main(String[] args){//** ...

  8. 指针数组下标JAVA_Java语言中可用下标和指针两种方式表示数组元素。

    [判断题]一行可以写多条预处理命令 [判断题]如果一个java程序中有多个类,编译后只生成一个字节码文件,其名字同主类名一致. [判断题]Protected类型的实例变量只能在本类中使用,其他类中不可 ...

  9. 017循环的方式定义数组、018循环for each、019方法练习、020实参和形参、021方法的返回值

    017循环的方式定义数组 using System;namespace _017循环的方式定义数组 {class Program{static void Main(string[] args){// ...

最新文章

  1. 使用acme.sh撸一个免费且自动更新的HTTPS证书
  2. 删除Linux的依赖库并进入救援模式恢复
  3. Spring - Java/J2EE Application Framework 应用框架 第 7 章 事务管理
  4. 1030 完美数列 (25 分)(c语言)
  5. python 内置函数转list_python 内置函数等的相互转换示例
  6. 九、Pandas高级处理
  7. go 根据输入类型执行对应的方法_Go 每日一库之 sqlc
  8. mysql compopr_MySql应用的基本操作语句
  9. 一个优秀的硬件工程师要具备的能力
  10. AWS Account
  11. 客服QQ,打开临时会话框(不用加为好友)
  12. hackerrank初级篇之staircase
  13. 科学计算机常用按键,电脑计算器里面的“科学型”的里面所有的按键的功能
  14. Scrollbar样式介绍
  15. 什么是SAP的统驭科目
  16. android 实用代码
  17. 新手村 - 第四站,认识成交量
  18. 【开关电源1】反激开关电源问题描述和解决方法
  19. 小程序中公告消息左右滚动跑马灯效果
  20. Linq-20220817更新

热门文章

  1. hdu 2196(经典树形dp)
  2. 求a^b前n位和后n位
  3. Linux平台swift语言开发学习环境搭建
  4. tensorflow实现基于LSTM的文本分类方法
  5. Ubuntu16.04 安装RabbitMQ
  6. 超长数列中n个整数排序C++代码实现
  7. Linux0.11内核--系统中断处理程序int 0x80实现原理
  8. 神经网络训练细节之batch normalization
  9. 【Leetcode】二叉树展开为列表(递归思想)
  10. C++编译链接的那些小事