本文已参与「新人创作礼」活动,一起开启掘金创作之路。 7.7 SI和DI
问题7.2
assume cs:code,ds:data
data segment
db 'welcome to masm!'
db '................'
data ends
code segment
start: mov ax,data
mov ds,ax
mov si,0
mov cx,10h
s: mov ax,[si]
mov [16+si],ax
add si,2
loop s
mov ax,4c00h
int 21h
code ends
end start
更灵活的方式:
[bx+di]
[bx+si]
问题7.4
7.9[bx+si+idata]和[bx+di+idata]
问题7.5
7.10不同的寻址方式的灵活应用
ATTENTION:
常量表示地址时记得加上段地址
变量表示地址段地址默认为ds
[bx+si+idata]更加灵活,更加结构化的角度来看待所要处理的数据
问题7.6
assume cs:code,ds:data
data segment
db'1. file '
db'2. edit '
db'3. search '
db'4. view '
db'5. options '
db'6. help '
data ends
code segment
start: mov ax,data
mov ds,ax
mov bx,0
mov cx,6
s: mov al,[bx+3]
and al,11101111b
mov [bx+3],al
add bx,10h
loop s
mov ax,4c00h
int 21h
code ends
end start
问题7.7(代码存在bug)存疑?
assume cs:code,ds:data,ss:stack
data segment
db 'ibm '
db 'dec '
db 'dos '
db 'vax '
data ends
stack segment
dw 0,0,0,0,0,0,0,0
stack ends
code segment
start: mov ax,data
mov ds,ax
mov ax,stack
mov ss,ax
mov sp,16
mov bx,0
mov cx,3
s: push cx
mov si,0
mov cx,4
s1: mov al,[si+bx]
and al,11011111b
mov [si+bx],al
add si,10h
loop s1 ;此时的cx已经为零了吧
;mov cx,dx ;在进行外层循环时恢复CX的值
inc bx
pop cx
loop s ;CX=CX-1 再判断是否为零
mov ax,4c00h
int 21h
code ends
end start
DEBUG找bug
-t单步执行至跳出内存循环
发现CX越界???WHY???
先减一再检查是否为0
0-1=FFFF(补码)
解决方法:
应该在每次开始内存循环的时候,将外层循环的cx中的数值保存起来,在执行外层循环的loop指令前,再恢复外层循环的cx数值
寄存器dx来临时保存cx中的数值
用寄存器暂时存放不够安全!!
开辟一段内存空间
使用栈存放
用栈存放确实安全
问题7.9
assume cs:code,ds:data,ss:stack
stack segment
dw 0,0,0,0,0,0,0,0
stack ends
data segment
db '1. display......'
db '2. brows........'
db '3. replace......'
db '4. modify.......'
data ends
code segment
start: mov ax,data
mov ds,ax
mov ax,stack
mov ss,ax
mov sp,16
mov si,0
mov cx,4
s: push cx
mov cx,4
mov bx,3
s1: mov al,[si+bx]
or al,00100000b
mov [si+bx],al
inc bx
loop s1
add si,10h
pop cx
loop s
mov ax,4c00h
int 21h
code ends
end start
Attention:
双重循环使用时,注意变量的赋值问题!!!
例如
此处内部循环为列变量变换
对列变量赋值放在外循环中(注意理解)
外部循环为行变量变换
对行变量赋值在代码初始化阶段(注意理解