一个人的命运啊,当|

wenli7363

园龄:3年3个月粉丝:7关注:6

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 不同的寻址方式

1

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]

2


8 指令中数据在哪里?有多长?

  1. 学过计组就知道,数据可以是立即数、寄存器中的、内存中的
    3
posted @   wenli7363  阅读(75)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起