刚学到问题7.7自己写的,好搞笑的代码
编程 将datasg段中的每个单词改为大写字母assume cs:code,ds:data
data segment
db 'ibm '
db 'dec '
db 'dos '
db 'vax '
data ends
code segment
start:mov ax,data
mov ds,ax
mov si,0
mov bx,0
mov cx,3
s:mov cx,4
s1:mov al,
and al,11011111b
mov ,al
add bx,10h
loop s1
mov bx,0
inc si
loop s
mov ax,4c00h
int 21h
code ends
end start
课本说先思考再往后看 于是我就写出了上面这段代码杯具发生了....:'(
看到这题后我第一时间想到用嵌套,虽然把它们都改为大写字母了,但是程序进入一个无限循环。用debug调试发现cx的值在循环结束后又变回原来的数字。:@ 第二个循环覆盖了第一个循环的cx值....
很简单,push第一个cx值,第二个循环用完了在pop出来就行了撒.. 栈的长度怎么来定义我只定义了一个字型单元的长度 调试不了改到八个字型单元长度才可以 第一循环的值CX是4,第二个循环把第一个循环的值覆盖了,当结束完内循环S1后,CX的值为0,不在循环。向下执行到loop S处,先将CX的值减一。就会溢出,CX的值就变了,然后跳到S处,再向下,又会执行S1处的循环,一直这样下去。你将循环S的CX值PUSH一下,或者用其他寄存器,内存地址保存一下,在将S1的CX赋值。S1循环完了,在恢复S的CX值就可以了:Q
说那么多,自己都晕了,不知道你看的明白不:lol 本帖最后由 ever.g 于 2011-11-1 16:42 编辑
;P 一个溢出造成的无限循环。。谁让loop要先cx-1再比较呢。。
0-1 就借位变ffff了。。 api 发表于 2011-11-1 16:11 static/image/common/back.gif
栈的长度怎么来定义我只定义了一个字型单元的长度 调试不了改到八个字型单元长度才可以
你没看前面的章节吗?
栈也是内存单元... 不定义默认栈顶是ffff
如果要定义
assume ss:stacksg
stacksg segment
dw 8 dup(0)
stacksg ends
这样就定义了16个字节单元的栈..
页:
[1]