8086 第四部分 内存寻址方式
第四部分
1 处理字符问题
在汇编程序中,用'.....'
的方式指明数据是以字符形式给出的,编译器会自动将单引号内容转化为ASCII码
ASCII中大小写字母的规律
大写+20H-->小写 小写-20H-->大写

大小写转换练习 位运算!!
题目:对datasg中的字符,第一个字符串,小写全部转大写,第二个字符串,大写全部变成小写
assume cs:codesg,ds:datasg datasg segment db 'BaSic' db 'iNfOrMaTiOn' datasg ends ;题解 codesg segment start: mov ax,datasg mov ds,ax ;第一个字符串:大写转化为小写 mov bx,0 mov cx,5 s: mov al,[bx] and al,11011111b ;按位与操作 mov [bx],al inc bx loop s ;第二个字符串:小写转化为大写 mov bx,5 mov cx,11 s0: mov al,[bx] or al,00100000b mov [bx],al inc bx loop s0 codesg ends end start
2 [bx+idata]方式寻址
idata是一个立即数
[]
表示一个内存单元,偏移地址就是(bx)+idata
已知段地址寄存器ds,那么实际物理地址为(ds)*16+200+(bx)
3 SI和DI寄存器 --变址寄存器
SI
:source index 源变址寄存器
DI
:destination index, 目标变址寄存器
这两个寄存器和通用寄存器(比如BX,AX)的一个区别:这两个寄存器只能当16位寄存器用,不能拆成两个8位寄存器
4 [bx+si]和[bx+di]方式寻址
基址变址寻址方式
MOV AX,[BX+SI]
等价于(ax)=((ds)*16+(bx)+(si))
基址变址寻址的另一种写法
mov ax,[bx][si]
5 [bx+si+idata]和[bx+di+idata]方式寻址

6 不同的寻址方式
6.1 二重循环问题的处理方法
对于汇编中的循环,我们靠CX寄存器控制循环的次数,但是对于多重循环,我们只有一个cx寄存器是不够的
视频P37集,讲了三种处理方法
1.在内层循环前,将外层循环的cx值另存一个寄存器中,比如Dx,等内层循环结束后,将dx的值恢复到cx中 -----但是,只有寄存器数量是有限的,会造成浪费
2. 用一个固定的内存空间来替换上述寄存器的工作 ----有可能覆盖已经有其他数据的内存地址
3. [最好的方法]用栈段来存cx的值:在进入内层循环前,将当前外层循环的cx值入栈,将cx设为内层循环的次数,内层结束后,cx值出栈,cx存外层循环的循环次数
7 用于内存寻址的寄存器
8086汇编中,只有四种寄存器用于寻址BX,SI,DI,BP
,也只有这些能够用[..]
进行内存寻址
其中BP
是一种指针寄存器。
//1. 这是一个错误指令,因为cx不是一种用于内存寻址的寄存器 mov ax,[cx] //2. 不能用两个基址寄存器中的一个做偏移地址,也不能将两个变址寄存器中的一个做基址 //如下错误 mov ax,[bx+bp]
8 指令中数据在哪里?有多长?
- 学过计组就知道,数据可以是立即数、寄存器中的、内存中的
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步