8086 汇编笔记(六):更灵活的定位内存地址的方法

简介: 8086 汇编笔记(六):更灵活的定位内存地址的方法

一、and 和 or 指令

and 指令:逻辑与指令,按位进行与运算(有 0 得 0,全 1 得 1)

mov al,01100011B
and al,00111011B
 
结果:00100011B

or 指令:逻辑或指令,按位进行或运算(有 1 得 1,全 0 得 0)

mov al,01100011B
and al,00111011B
 
结果:01111011B

二、以字符形式给出的数据

我们可以在汇编程序中,用 ‘’ 的方式指明数据是以字符的形式给出的,编译器将把它们转化为相对应的 ASCII 码

data segment
 
    db 'unIX'        ;相当于 db 75H,6EH,49H,58H
    db 'foRK'
 
data ends
 
code segment
 
start:  mov al,'a'        ;相当于 mov al,61H
        mov bl,'b'
 
        mov ax,4c00h
        int 21h
 
code ends
 
end start

三、大小写转换的问题

在ASCII码中,小写字母的对应范围为:61H - 7AH。大写字母的对应范围为:41H - 5AH。可见同一个字母的大写形式的ASCII码比小写形式的ASCII码小20H。

仔细观察大小写字母所对应的ASCII吗二进制形式,可以发现如下规律:大写字母从右数第6位(从1开始计算)全为0,小写字母从右数第6位全为1。

综上我们可以总结出大小写转换的两种方式:

字母大小写转换方式1:

  1. 大写字母加上20h可转换为小写字母。
  2. 小写字母减去20h可转换为大写字母。

字母大小写转换方式2:

  1. 字母转大写:逻辑与11011111B。
  2. 字母转小写:逻辑或00100000B。
datasg segment
 
    db 'BaSiC'              ;转大写
    db 'iNfOrMaTiOn'        ;转小写
 
datasg ends
 
codesg segment
 
start:  mov ax,datasg        ;设置 ds 指向 datasg 段
        mov ds,ax
        mov bx,0             ;设置(bx)=0,ds:bx 指向'Basic'的第一个字母
        mov cx,5            ;设置循环次数5,因为'Basic'有5个字母
 
s:      mov al,[bx]          ;将 ASCII 码从 ds:bx 所指向的单元中取出
        and al,11011111B     ;与运算转大写
        mov [bx],al          ;值重新送入 bx 中
        inc bx               ;+1 指向下一个字符
        loop s
 
        mov bx,5             ;设置 (bx)=5,ds:bx 指向'iNfOrMaTion'的第一个字母
        mov cx,11
 
s0:     mov al,[bx]
        or al,00100000B
        mov [bx] al
        inc bx
        loop s0
 
        mov ax,4c00h
        int 21h
 
codesg ends
 
end start

四、[bx+idata]

这是一种"变量+常量"的寻址方式

[bx+idata]表示一个内存单元,它的偏移地址为(bx)+idata

mov ax, [bx+200]

表示将一个内存单元的内容送入ax,这个内存单元的长度为2个字节(字单元),存放一个字,偏移地址为bx中的数值加上200,段地址在ds中

该指令的常用格式有:

mov ax, [bx+200]
mov ax, 200[bx]
mov ax, [bx].200

五、SI 和 DI

它俩的功能与 bx 相近

SI和DI不能够分成两个8位寄存器来使用

;(1)
mov bx,0
mov ax,[bx]
 
;(2)
mov si,0
mov ax,[si]
 
;(3)
mov di,0
mov ax,[di]

六、[bx+si] 和 [bx+di]

这是一种“变量+变量”的寻址方式

常用指令格式:

mov ax, [bx+si]
mov ax, [bx][si]

七、[bx+si+idata] 和 [bx+di+idata]

这是一种"变量+变量+常量"的寻址方式

常用指令格式:

mov ax, [bx+200+si]
mov ax, [200+bx+si]
mov ax, 200[bx][si]
mov ax, [bx].200[si]
mov ax, [bx][si].200

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

总结一下前面讲到的几种定位内存地址的方法(寻址方式):

(1)[idata]用一个常量来表示地址,可用于直接定位一个内存单元;

(2)[bx]用一个变量来表示内存地址,可用于间接定位一个内存单元;

(3)[bx+idata]用一个变量和常量表示地址,可在一个起始地址的基础上用变量间接定位一个内存单元;

(4)[bx+si]用两个变量表示地址;

(5)[bx+si+idata]用两个变量和一个常量表示地址。

相关文章
|
1月前
|
存储 安全 iOS开发
内存卡怎么格式化?6个格式化方法供你选
随着使用时间的增加,内存卡可能会因为数据积累、兼容性或是文件系统损坏等原因需要进行格式化。那么怎样正确格式化内存卡呢?格式化内存卡的时候需要注意什么呢?本文会给大家提供详细的步骤,帮助大家轻松完成格式化内存卡的操作。
|
3月前
|
存储 前端开发 Java
Kotlin教程笔记 - MVVM架构怎样避免内存泄漏
Kotlin教程笔记 - MVVM架构怎样避免内存泄漏
46 2
|
3月前
|
监控 JavaScript 算法
如何使用内存监控工具来定位和解决Node.js应用中的性能问题?
总之,利用内存监控工具结合代码分析和业务理解,能够逐步定位和解决 Node.js 应用中的性能问题,提高应用的运行效率和稳定性。需要耐心和细致地进行排查和优化,不断提升应用的性能表现。
220 77
|
3月前
|
监控 JavaScript Java
Node.js中内存泄漏的检测方法
检测内存泄漏需要综合运用多种方法,并结合实际的应用场景和代码特点进行分析。及时发现和解决内存泄漏问题,可以提高应用的稳定性和性能,避免潜在的风险和故障。同时,不断学习和掌握内存管理的知识,也是有效预防内存泄漏的重要途径。
304 62
|
3月前
|
传感器 人工智能 物联网
C 语言在计算机科学中尤其在硬件交互方面占据重要地位。本文探讨了 C 语言与硬件交互的主要方法,包括直接访问硬件寄存器、中断处理、I/O 端口操作、内存映射 I/O 和设备驱动程序开发
C 语言在计算机科学中尤其在硬件交互方面占据重要地位。本文探讨了 C 语言与硬件交互的主要方法,包括直接访问硬件寄存器、中断处理、I/O 端口操作、内存映射 I/O 和设备驱动程序开发,以及面临的挑战和未来趋势,旨在帮助读者深入了解并掌握这些关键技术。
88 6
|
4月前
|
机器学习/深度学习 算法 物联网
大模型进阶微调篇(一):以定制化3B模型为例,各种微调方法对比-选LoRA还是PPO,所需显存内存资源为多少?
本文介绍了两种大模型微调方法——LoRA(低秩适应)和PPO(近端策略优化)。LoRA通过引入低秩矩阵微调部分权重,适合资源受限环境,具有资源节省和训练速度快的优势,适用于监督学习和简单交互场景。PPO基于策略优化,适合需要用户交互反馈的场景,能够适应复杂反馈并动态调整策略,适用于强化学习和复杂用户交互。文章还对比了两者的资源消耗和适用数据规模,帮助读者根据具体需求选择最合适的微调策略。
1330 5
|
4月前
|
缓存 监控 Java
在使用 Glide 加载 Gif 动画时避免内存泄漏的方法
【10月更文挑战第20天】在使用 Glide 加载 Gif 动画时,避免内存泄漏是非常重要的。通过及时取消加载请求、正确处理生命周期、使用弱引用、清理缓存和避免重复加载等方法,可以有效地避免内存泄漏问题。同时,定期进行监控和检测,确保应用的性能和稳定性。需要在实际开发中不断积累经验,根据具体情况灵活运用这些方法,以保障应用的良好运行。
|
4月前
|
存储 弹性计算 算法
前端大模型应用笔记(四):如何在资源受限例如1核和1G内存的端侧或ECS上运行一个合适的向量存储库及如何优化
本文探讨了在资源受限的嵌入式设备(如1核处理器和1GB内存)上实现高效向量存储和检索的方法,旨在支持端侧大模型应用。文章分析了Annoy、HNSWLib、NMSLib、FLANN、VP-Trees和Lshbox等向量存储库的特点与适用场景,推荐Annoy作为多数情况下的首选方案,并提出了数据预处理、索引优化、查询优化等策略以提升性能。通过这些方法,即使在资源受限的环境中也能实现高效的向量检索。
101 1
|
4月前
|
存储 Java
JVM知识体系学习四:排序规范(happens-before原则)、对象创建过程、对象的内存中存储布局、对象的大小、对象头内容、对象如何定位、对象如何分配
这篇文章详细地介绍了Java对象的创建过程、内存布局、对象头的MarkWord、对象的定位方式以及对象的分配策略,并深入探讨了happens-before原则以确保多线程环境下的正确同步。
84 0
JVM知识体系学习四:排序规范(happens-before原则)、对象创建过程、对象的内存中存储布局、对象的大小、对象头内容、对象如何定位、对象如何分配
|
4月前
|
存储 前端开发 Java
Kotlin教程笔记 - MVVM架构怎样避免内存泄漏
Kotlin教程笔记 - MVVM架构怎样避免内存泄漏

热门文章

最新文章