前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >汇编语言内存寻址方式--04

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

作者头像
大忽悠爱学习
发布2022-06-20 09:05:50
5380
发布2022-06-20 09:05:50
举报
文章被收录于专栏:c++与qt学习

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


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


处理字符问题

程序段前缀是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看起


本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-06-19,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 汇编语言内存寻址方式--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用途
                                                                      • 举例
                                                                      领券
                                                                      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档