+ -
当前位置:首页 → 问答吧 → 转换数字成字符串输出提示溢出,求解

转换数字成字符串输出提示溢出,求解

时间:2011-11-15

来源:互联网

Assembly code

assume cs:code
data segment
    db 16 dup(0)
data ends
stack segment
    db 32 dup(0)
stack ends
code segment
    start: mov ax,data
             mov ds,ax
             mov ax,stack
             mov ss,ax
             mov ax,12666
             mov sp,20H
             call dtoc
             mov dh,8
             mov dl,3
             mov cl,2
             mov si,0
             call show_str
             mov ax,0a00H
             int 21H
             mov ax,4c00H
             int 21H
    dtoc:     push ax
             push bx
             push dx
             push ds
             mov si,0
             mov bx,10
        OK2: div bx
             add dx,30H
             mov ds:[si],dx                ;保存余数
             mov dx,0
             inc si
             mov cx,ax
             jcxz dtoc2                    ;如果cx为零,跳转
             jmp OK2
             
    dtoc2: mov ds:[si],0
             mov di,0
             dec si
             mov ax,si
             mov bl,2
             div bl
             
             mov cl,al
             mov ch,0
             
    change:
             mov al,ds:[di]
            mov ah,ds:[si]
            mov ds:[di],ah
            mov ds:[si],al
            
            inc di
            dec si
            loop change
            pop ds
            pop dx
            pop bx
            pop ax
            ret
            
show_str:push bx
            push ax
            push dx
            push ds
            push es
            push si
            push cx
            
            mov ax,0b800H
            mov es,ax
            mov al,0a0H
            mul dh
            mov bx,ax
            mov al,dl
            mov ah,2
            mul ah
            add bx,ax
            call s
            
            pop cx
            pop si
            pop es
            pop ds
            pop dx
            pop ax
            pop bx
            ret;这里不返回将会出错,用于返回调用show_str的地方
    s:     push cx
            mov cl,ds:[si]
            mov ch,0
            jcxz OK
            pop cx
            mov al,ds:[si]
            mov es:[bx],al
            mov es:[bx+1],cl
            add bx,2
            inc si
            jmp short s
            
    OK:    pop cx
            ret ;返回调用s的地方去

        code ends
end start


代码就是上面的,是书里的内容,一运行就提示溢出,但是我一步一步跟的时候没有提示。
对了,那个show_str是验证过的,之前写的可以得到正确结果。
ds:0也可以看到转换位置后的字符串12666.

作者: yuanxiaobo007   发布时间: 2011-11-15

直接运行出错,调试时可以,一般是有寄存器没有被正确初始化。你这程序里就是在 dtoc 中 dx 没有被置 0 。因为 div bx 是 DX:AX 除以 BX 的,AX 中是待显示的值,所以 DX 应该置 0 。

作者: zara   发布时间: 2011-11-16