[bx + idata]方式寻址
- 类似于数组
- 同时将第一个字符串转化为大写,第二个字符串转化为小写
assume cs:codesg,ds:datasg datasg segment db 'BaSiC' db 'MinIX' 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 mov al, [5 + bx] or al, 00100000b mov [5 + bx],al inc bx loop s mov ax, 4c00h int 21h codesg ends end start
[bx + si]和[bx + di]
- bx 基址寄存器
- si 源变址寄存器
- di 目的变址寄存器
mov ax,[bx+si]
的含义
将一个内存单元的内容送入ax
这个内存单元的长度为2字节,存放一个字
偏移地址[bx + si]
段地址在ds中mov ax,[bx+si]
可以写成mov ax,[bx][si]
mov ax,2000H mov ds,ax mov bx,1000H mov si,0 mov ax,[bx+si] inc si mov cx,[bx+si] inc si mov di,si mov ax,[bx+di]
[bx+si+idata]和[bx+di+idata]
mov ax,[bx+si+idata]
将一个内存单元的内容送入ax
这个内存单元的长度为2字节(字单元),存放一个字
偏移地址为[bx+si+idata]
段地址在ds中mov ax,[bx+si+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
mov ax,[bx][si]
不同寻址方式的灵活应用
[idata]
适用于直接确定内存中某个位置的数据[bx]
适用于 一维数组的循环操作 / 二维数组确定每一行的开头[bx+idata]
适用于 确定二维数组每一行中某个位置的数据
[bx + si] / [bx + di]
适用于二维数组从前往后的循环操作[bx + si + idata] / [bx + di + idata]
适用于二维数组从某一位置开始的循环操作
二重循环的处理方法
将datasg段中每个单词改为大写字母
- 方法1:用dx保存数据
assume cs:codesg,ds:datasg datasg segment db 'ibm ' db 'dec ' db 'dos ' db 'vax ' datasg ends codesg segment start: mov ax,datasg mov ds,ax mov bx,0 mov cx,4 s0: mov dx,cx ;将外层循环的cx值保存在dx中 mov si,0 ;内层循环从0开始 mov cx,3 ;cx设置为内层循环的次数 s: mov al,[bx+si] and al,11011111b mov [bx+si],al inc si loop s add bx,16 ;设置外层循环开始的位置 mov cx,dx ;将dx中保存的外层循环的值放回cx中 loop s0 mov ax, 4c00h int 21h codesg ends end start
- 用固定的内存空间保存数据
mov ax,datasg mov ds,ax mov bx,0 mov cx,4 s0:mov ds:[40H],cx ;将外层循环的cx值保存在datasg:40H单元中 mov si,0 mov cx,3 ;设置内层循环的次数为3 s:mov al,[bx+si] and al,11011111b mov [bx+si],al inc si loop s add bx,16 mov cx,ds:[40H] ;将datasg:40H中保存的数据放回到cx中 loop s0
- 使用栈来保存数据
;定义栈段 stacksg segment dw 0,0,0,0,0,0,0,0 stacksg ends mov ax,stacksg ;初始化栈段寄存器 mov ss,ax mov sp,16 ;堆栈指针寄存器 mov ax,datasg ;初始化数据段寄存器 mov ds,ax mov bx,0 mov cx,4 s0:push cx ;将cx压栈 mov si,0 mov cx,3 s: mov al,[bx+si] and al,11011111b mov [bx+si],al inc si loop s add bx,16 pop cx loop s0
图示不同寻址过程
- 直接寻址过程:
首先根据cs:ip
的值通过地址加法器合成物理地址到内存中读取到相应的指令,之后通过数据总线传送到指令缓冲寄存器,对指令进行解析,发现其中需要用到ds:[000E]
的数据,是个字,所以通过地址加法器从内存中取出0EA1
,通过数据总线放到ax当中
- 其它同理