. : : Assembly Language : : .  |  首页  |  我提出的问题  |  我参与的问题  |  我的收藏  |  消息中心   |  游客  登录  | 
刷新 | 提问 | 未解决 | 已解决 | 精华区 | 搜索 |
  《汇编语言》论坛 ->CALL和RET指令
  管理员: assembly   [回复本贴] [收藏本贴] [管理本贴] [关闭窗口]
主题 : :  第10章试验,dtoc子程序卡死  [待解决] 回复[ 0次 ]   点击[ 116次 ]  
rhinoos
[帖 主]   [ 发表时间:2021-02-14 18:14 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2020-12-21 11:51
运行环境:windows10下的dosbox

dtoc程序是一个把十进制数转换成字符串的程序,我的实现方法是把处理完毕的字符都入栈,然后依次出栈到ds上(也就是pour标签下的程序),但是不知为何pour下一加入pop ax,在dosbox下运行就不出end了,后面发现只要是试图改sp值都不会出end,根本不知道是什么原因

assume cs:code,ds:data
data segment
                DB 16 DUP(0)
data ends
code segment
        start:   
                        main:                            
                                mov ax,data
                                mov ds,ax
                                mov dx,000FH 
                                mov ax,4240H                 
                                call dtoc

        
                                mov ax,4c00h
                                int 21h

                        show_str: ;函数介绍:将以0结尾的字符串显示在屏幕上,ds:si指向字符串,其他参数在栈中,为:行号,列号,颜色(由栈顶向栈底)
                                push bp 
                                mov bp,sp                ;bp指向栈顶

                                mov bx,0b800h        ;用es:bx+di指向显存
                                mov es,bx   

                                mov ax,160         ;根据行和列计算在显存中相应的偏移地址,存入bx中
                                mul word ptr [bp+4] 
                                mov bx,[bp+6]
                                add bx,bx 
                                add bx,ax  
                                        
                                putchar:
                                                mov ax,ds:[si]
                                                mov es:[bx+di],ax
                                                mov ax,[bp+8]
                                                mov es:[bx+di+1],ax
                                                add di,2
                                                inc si
                                                cmp byte ptr ds:[si],0
                                                je show_str_end
                                jmp short putchar

                                show_str_end:                   ;还原子程序中用到的参数    
                                                pop bp
                                                ret  

                dtoc:        ;函数介绍:将DWORD型数据转化为十进制字符串放入栈中,参数为DX(DWORD型数据高16位),AX(DWORD型数据低16位) 
                                   push bp
                                mov bp,sp                                            
                                dtoc_start:        
                                        mov cx,10
                                        call divdw 
                                        add cx,30h 
                                        push cx 
                                        cmp ax,0 
                                        je pour 
                                        jmp short dtoc_start        
                                pour:
                                        pop ax ;一加入这个就不出现end
                                        ; mov byte ptr ds:[si],al
                                        ; inc si 
                                        ; cmp ax,0000h 
                                        ; je dtoc_end
                                        ; jmp pour        
                                dtoc_end:
                                        ret



                        DIVDW:        ;函数介绍:进行不会产生溢出的除法运算,被除数为dword型,除数为word型
                                        ;参数为DX(DWORD型数据高16位),AX(DWORD型数据低16位),CX(除数,WORD型)
                                        ;结果以DX和AX分别存放结果高16位和低16位,CX存放余数
                
                                        PUSH AX
                                        MOV AX,DX   ;先计算高16位
                                        MOV DX,0    
                                        DIV CX  
                                        MOV BX,AX   ;暂时用BX存放结果的高16位,这时DX要存放运算数
                                        POP AX

                                        DIV CX      ;计算出结果低16位
                                        MOV CX,DX   ;CX存放余数
                                        MOV DX,BX   ;DX存放结果高16位

                                        MOV BX,0        

                                        RET                    

code ends
END START
需要登录后才能回帖 -->> 请单击此处登录
    Copyright © 2006-2024   ASMEDU.NET  All Rights Reserved