api 发表于 2011-11-1 15:25:46

刚学到问题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的值在循环结束后又变回原来的数字。:@

yipwing 发表于 2011-11-1 15:37:48

第二个循环覆盖了第一个循环的cx值....
很简单,push第一个cx值,第二个循环用完了在pop出来就行了撒..

api 发表于 2011-11-1 16:11:11

栈的长度怎么来定义我只定义了一个字型单元的长度   调试不了改到八个字型单元长度才可以

cyht33 发表于 2011-11-1 16:14:50

第一循环的值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:41:27

本帖最后由 ever.g 于 2011-11-1 16:42 编辑

;P 一个溢出造成的无限循环。。谁让loop要先cx-1再比较呢。。
0-1 就借位变ffff了。。

yipwing 发表于 2011-11-1 17:17:52

api 发表于 2011-11-1 16:11 static/image/common/back.gif
栈的长度怎么来定义我只定义了一个字型单元的长度   调试不了改到八个字型单元长度才可以

你没看前面的章节吗?
栈也是内存单元... 不定义默认栈顶是ffff
   如果要定义
assume ss:stacksg

stacksg segment
dw 8 dup(0)
stacksg ends
这样就定义了16个字节单元的栈..

z310394543 发表于 2011-11-1 22:05:29

z310394543 发表于 2011-11-1 22:08:47

z310394543 发表于 2011-11-1 22:10:17

页: [1]
查看完整版本: 刚学到问题7.7自己写的,好搞笑的代码