汇编语言内存寻址方式--04

2022-06-20 09:05:50 浏览数 (1)

汇编语言内存寻址方式--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看起


0 人点赞