更灵活的定位内存地址的方法

与其说这一章是在讲如何在汇编语法上更方便的定位内存地址,不如说是如何在底层中抽象出一种数据结构来。

and和or指令

and指令:逻辑与指令,按位进行计算,全一得一
or指令:逻辑或指令,按位进行计算,逢一得一

以字符形式给出数据

在汇编程序中,以'....'指明数据是以字符的形式给出的,编译器将把他们转换位相应的ASCII码。

ASCII码大小写转换的问题

同一个字母的大写写小写字符对应的ASCII码是不同的,他们之间相差20H。使用二进制表示也就是相差100000B。
UTOOLS1560927449284.png

所以很明显的看出来,大写字母和小写字母之间的区别就是第6位(位数从1开始计算)是否为1。

[bx+idata]

mov ax, [bx+200]
数学化的描述为:(ax)=((ds)*16+(bx)+200)
该指令还可以写成如下形式:
mov ax, [200+bx]
mov ax, 200[bx]
mov ax, [bx].200

si和di

在8086中和bx功能相近的寄存器,bx是默认的数据段偏移地址寄存器。
si和di都可以作为数据段偏移地址寄存器来使用,与bx的用法相同。但si和di不能够分成两个8位寄存器。

[bx+si]和[bx+di]

之前是一个常量加上一个变量(bx),现在是两个常量,可以看出来,偏移地址的指定更加的灵活了。
指令mov ax, [bx+si]
数学化的描述为:(ax)=((ds)*16+(bx)+(si))
也可以是以下格式:
mov ax, [bx][si]

[bx+si+idata]

不必多说,应该很容易明白。

不同的寻址方式的灵活应用

  1. [idata]用一个常量来表示地址,用于直接定位一个内存单元
  2. [bx]用一个变量来表示内存地址,用于间接定位一个内存单元
  3. [bx+idata]用一个变量和常量表示地址,在一个起始地址的基础上偏移
  4. [bx+si]用两个变量表示地址
  5. [bx+si+idata]用两个变量和一个常量表示地址

问:如何实现一个嵌套的循环
答:使用另外一个寄存器或者使用内存展示存储cx的值,在遇到对应的循环语句时将其取出。





原文地址:https://www.cnblogs.com/freesfu/p/11051585.html