汇编语言内存寻址方式--04
- 处理字符问题
- 大小写转换的问题
- Debug中执行程序
- [bx idata]方式寻址
- [bx idata]的含义
- 应用:用[bx idata]的方式进行数组的处理
- 在Debug中执行
- SI和DI寄存器
- CPU内部的寄存器
- SI和DI常执行与地址有关的操作
- 应用SI和DI
- 程序运行
- [bx si]和[bx di]方式寻址
- 案例
- [bx si idata]和 [bx di idata]
- [bx si idata]和[bx di idata]方式指定地址
- 案例
- 不同的寻址方式的灵活应用
- 对内存的寻址方式
- 案例1:灵活应用不同的寻址方式
- 案例2:灵活应用不同的寻址方式
- 二重循环问题的处理-法1
- 二重循环问题的处理-法2、法3
- 不同寻址方式演示
- 内存的寻址方式
- 直接寻址过程
- 寄存器间接寻址过程
- 寄存器相对寻址过程
- 基址变址寻址过程
- 相对基址变址寻址过程
- 用于内存寻址的寄存器
- 哪些寄存器用于寻址?
- 用于内存寻址的寄存器用法
- 在哪里?有多长?
- 两个基本问题
- 汇编语言中数据位置的表达
- 指令要处理的数据有多长?
- 寻址方式的综合应用
- 应用问题
- 解决方案
- C语言和汇编的处理方式对比
- 用div指令实现除法
- div 指令
- div 指令示例
- 在内存单元中实施除法
- 用dup设置内存空间
- dup功能和用法
- dup用途
- 举例
本系列文章参考汇编语言第四版和汇编语言程序设计 贺利坚主讲整理而成
处理字符问题
程序段前缀是Dos下可执行程序载入内存后结构的一部分,位于前0100h部分,它的大致作用有: (1) 子进程通过程序段前缀继承、恢复父进程的信息 (2 ) 使子进程正确地返回到父进程 ( 3) 恢复中断23 H 和24H 的入口地址 (4) 给子进程提供Dos 的入口信息
大小写转换的问题
大写字母第六位一定为0,小写字母第六位一定为1,因此要将大写字母变成小写,只需要将第六位变为0即可,小写转大写,第六位给一即可
Debug中执行程序
[bx idata]方式寻址
[bx idata]的含义
如果将bx作为数组的首地址的话,那么idata可以看做是相对于数组首地址的偏移地址,因为数组中每个元素的大小是一样的,假设都占四个字节,那么idata初始值为0,后面依次累加4即可访问数组下一个元素
应用:用[bx idata]的方式进行数组的处理
因为两个需要处理的字符串每个字符都相隔5个字节的距离,因此可以同时进行处理,利用上面讲到的[bx 5]即可。
在Debug中执行
SI和DI寄存器
CPU内部的寄存器
SI和DI常执行与地址有关的操作
应用SI和DI
程序运行
[bx si]和[bx di]方式寻址
bx是基址寄存器,si和di是变址寄存器
案例
Inc si即si 1,每次移动一个字节,但是取出来放入ax中的是一个字的大小
注意-->字的读取顺序:
先读高地址,再读低地址
[bx si idata]和 [bx di idata]
[bx si idata]和[bx di idata]方式指定地址
案例
不同的寻址方式的灵活应用
对内存的寻址方式
案例1:灵活应用不同的寻址方式
解释一下:
代码语言:javascript复制s: mov al,[bx 3]
and al,11011111b
mov [bx 3],al
add bx,16
loop s
因为每行固定为16个字节,因此要处理下一行数据时,只需要bx 16即可
案例2:灵活应用不同的寻址方式
二重循环问题的处理-法1
二重循环问题的处理-法2、法3
不同寻址方式演示
内存的寻址方式
直接寻址过程
- 取指令的过程
- 取数据的过程
某段内存到底是被当做数据还是指令,完全由我们自己决定
寄存器间接寻址过程
- 取指令的过程
- 取数据的过程
寄存器相对寻址过程
- 取指令的过程
上面是寄存器相对寻址,标注错了
- 取数据的过程
上面是寄存器相对寻址,标注错了
基址变址寻址过程
- 取指令的过程
- 取数据的过程
相对基址变址寻址过程
- 取指令的过程
- 取数据的过程
用于内存寻址的寄存器
哪些寄存器用于寻址?
每个寄存器的使用都有不同和相同之处,这取决于底层硬件具体是如何设置的,因此每个寄存器我们不能乱用,因为硬件层面决定两个寄存器能否互通数据
用于内存寻址的寄存器用法
每个寄存器的使用都有不同和相同之处,这取决于底层硬件具体是如何设置的,因此每个寄存器我们不能乱用,因为硬件层面决定两个寄存器能否互通数据
在哪里?有多长?
两个基本问题
汇编语言中数据位置的表达
指令要处理的数据有多长?
寻址方式的综合应用
应用问题
解决方案
C语言和汇编的处理方式对比
用div指令实现除法
div 指令
这里需要注意下面几点:
- 8 bit最大能表示255,通过除数为8位的时候,余数和商通常也为8位,那么对应的被除数应该为16位才对,因此用AX寄存器来存放被除数
- 同理除数如果是16位的话,那么被余数和商通常也为16位,那么对应的被除数应该为32位才对,因此用DX存放被被除数高位,AX存放被除数低位
- 因为被除数会默认使用AX或者AX加DX,因此我们在使用时,需要确保AX和DX被使用前,里面保存的值被转移到其他地方,例如: 放到某一个内存单元保存或者入栈保存,等到除法运算结束,再恢复寄存器本来的值
div 指令示例
在内存单元中实施除法
寄存器是CPU中的珍贵资源,能不占用就不占用,因此我们可以将除数直接从内存中获取,然后直接进行除法运算,而不经过寄存器
用dup设置内存空间
dup功能和用法
dup用途
举例
代码语言:javascript复制assume cs:code, ds:data
data segment
db 3 dup(0)
db 3 dup(0,1,2)
db 80 dup(0)
db 3 dup('abc','ABC')
data ends
code segment
mov ax,data
mov ds,ax
mov ax,4c00H
int 21H
code ends
end
程序加载进内存,此时DS=075A,需要跳过100h的程序段前缀,因此我们从076a看起