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

x33g5p2x  于10天前 转载在 其他  
字(1.8k)|赞(0)|评价(0)|浏览(14)

本系列文章参考汇编语言第四版和汇编语言程序设计 贺利坚主讲整理而成

处理字符问题

程序段前缀是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:灵活应用不同的寻址方式

解释一下:

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用途

举例

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看起

相关文章