|
发表于 2012-3-31 18:17:05
|
显示全部楼层
猪好大 发表于 2012-3-31 17:47
搞点了,编译通过了用debug调式没有发生everflow 量是在CMD运行就everflow了
解说在程序里面
- assume cs:code
- data segment
- db 10 dup (0)
- data ends
-
- code segment
- start : ;xor dx,dx
- mov ax,12666
- mov bx ,data
- mov ds,bx
- mov si,0
- call dtoc
-
- mov dh,8
- mov dl,2
- mov cl,2
- call show_str
-
- mov ax,4c00h
- int 21h
-
- dtoc:;这里给你一个建议,尽量将用到的寄存器Push进栈,函数结束的时候再pop回来
- xor dx,dx ;清0,保证DH不受上一次影响,你想想如果你在调用dtoc的时候
- mov cx,10 ;dx不为0会怎么样呢?本来你的数据12666 = 317AH
- ;但是如果dx为FFFF,这时候你的操作就是
- ;FFFF,317A / 10 = FFFF317 所以会产生溢出
- ;由于debug模式的调试机制,会对寄存器默认初始为0
- ;但是直接运行是不会的
- div cx ;你也可以把xor dx,dx 放到start:后面,你会发现程序也会正常运行
- add dl,30H ;但是不推荐这样做,至于为什么你以后会懂得 - -
- mov ds:[si],dl
- inc si
- mov dx,0
- mov cx,ax
- jcxz ok
- jmp short dtoc
- ok: mov ds:[si],al
- ret
-
- show_str:mov bp,0
- mov bx,cx
- mov ax,0b800h
- mov es,ax
- mov ax,0
- mov al,0A0h
- mul dh
- mov si,ax
- mov ax,0
- mov al,2
- mul dl
- add si,ax
- mov di,0
- mov cx,0
- push cx
- to: mov cl,ds:[di]
- jcxz go
- push cx
- inc di
- jmp short to
- go: pop cx
- jcxz home
- mov es:[bp+si],cl
- mov es:[bp+si+1],bl
- add bp,2
- jmp short go
- home:ret
-
-
- code ends
- end start
复制代码
|
|