|
主题 : : 问题7.7 [待解决] |
回复[ 6次 ]
点击[ 370次 ] | |
|
|
|
|
[帖 主]
[ 发表时间:2009-12-31 00:49 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:1
注册日期:2008-06-18 16:30 |
assume cs:code,ds:data
data segment
db 'ibm '
db 'dec '
db 'dos '
db 'vax '
dw 0
data ends
code segment
start:
mov ax,data
mov ds,ax
mov bx,0
mov cx,4
s0: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
loop s0
mov ax,4c00h
int 21h
code ends
end start
这里执行完内循环s到cx=1时,往下执行扫行到add bx,16时cx=0,再往下执到到loop s0时,cx已经为0了按书上的说法应该执行下面的指令的,实际调试时是跳转到去执行s0:mov si,0 这个怎么解释? | | |
|
|
|
|
[第1楼]
[ 回复时间:2009-12-31 09:44 ]
[引用]
[回复]
[ top ] | |
荣誉值:307
信誉值:0
注册日期:2009-03-15 23:46 |
内循环把外循环的 cx 值破坏了,进入内循环前要通过堆栈保护 cx :
mov cx,4
s0: mov si,0
push cx ;保护外循环的 cx 值
mov cx,3
s: mov al,[bx+si]
and al,11011111b
mov [bx+si],al
inc si
loop s
pop cx ;恢复外循环的 cx 值
add bx,16
loop s0 | | |
|
|
|
|
[第2楼]
[ 回复时间:2009-12-31 15:00 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:1
注册日期:2008-06-18 16:30 |
|
|
|
|
|
[第3楼]
[ 回复时间:2009-12-31 16:49 ]
[引用]
[回复]
[ top ] | |
荣誉值:307
信誉值:0
注册日期:2009-03-15 23:46 |
退出内循环时cx=0,楼主的意思因为cx=0程序也应该退出外循环,但loop指令的功能是:
① cx <- (cx)-1,即先将 cx 减一;
② 如果 cx 不等于 0 ,则跳转到目标地址继续循环,否则退出循环。
也就是说 loop 指令在判断 cx 是否为零时先要将其减一,零减一就成了0ffffh, 自然就不会退出循环,而是跳转到 s0 继续循环。 | | |
|
|
|
|
[第4楼]
[ 回复时间:2010-01-11 17:27 ]
[引用]
[回复]
[ top ] | |
荣誉值:61
信誉值:0
注册日期:2009-12-19 01:51 |
|
|
|
|
|
[第5楼]
[ 回复时间:2010-01-11 18:29 ]
[引用]
[回复]
[ top ] | |
荣誉值:62
信誉值:0
注册日期:2009-12-03 13:14 |
保存在哪里最合理,还要看当前系统内存的使用情况,个人意见 | | |
|
|
|
|
[第6楼]
[ 回复时间:2010-01-20 09:17 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2009-12-30 08:49 |
书中的程序是错误的,只能陷入死循环将所有内存的前三位都改写,进入内循环前必须保存CX的值才行 | | |