. : : Assembly Language : : .  |  首页  |  我提出的问题  |  我参与的问题  |  我的收藏  |  消息中心   |  游客  登录  | 
刷新 | 提问 | 未解决 | 已解决 | 精华区 | 搜索 |
  《汇编语言》论坛 ->CALL和RET指令
  管理员: assembly   [回复本贴] [收藏本贴] [管理本贴] [关闭窗口]
主题 : :  数值显示程序为什么不显示,且进入死循环  [待解决] 回复[ 3次 ]   点击[ 221次 ]  
yt2020
[帖 主]   [ 发表时间:2020-07-15 14:50 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2020-07-15 14:37
各位老师:下午好!

    学习汇编第十章,根据要求编写数值显示程序。调用生成数值子程序,使用d ds:0000 000f显示66621,虽然数值是反的,但数值正常写入内存。调用显示子程序,debug能正常通过,但运行exe程序不显示数值,且程序进入死循环,请各位老师帮忙看看问题在哪?
     另外,用d B800:0460 046f无法正确显示显示缓冲区内容,请问有没有命令显示显示缓冲区内容。谢谢!
    具体程序如下:
assume cs:code

data segment
 
    db 10 dup (0)
    
data ends

code segment

start:

      mov ax,12666
      mov bx,data
      mov ds,bx
      mov si,0
      call dtoc

      mov dh,8
      mov dl,3
      mov cl,2
      call display
      
      mov ax,4c00h
      
int 21h

dtoc: mov bx,10
s:    div bx
      mov cx,0
      mov cx,dx
      jcxz o
      add dx,30H
      mov ds:[si],dx
      inc si
      mov dx,0
      loop s
o:    ret

display: 
       push cx

        push si

        mov al,0A0h

        dec dh          ;行号在显存中下标从0开始,所以减1

        mul dh

        mov bx,ax

        mov al,2

        mul dl

        sub ax,2       ;列号在显存中下标从0开始,又因为偶字节存放字符,所以减2

        add bx,ax      ;此时bx中存放的是行与列号的偏移地址

        mov ax,0B800h

        mov es,ax      ;es中存放的是显存的第0页(共0--7页)的起始的段地址

        mov di,0

        mov al,cl

        mov ch,0

        mov si,0

s1:      mov cl,ds:[si]

        jcxz ok

        mov es:[bx+di],cl       ;偶地址存放字符

        mov es:[bx+di+1],al     ;奇地址存放字符的颜色属性

        inc si

        add di,2

        jmp short s1

ok:     pop si

        pop cx

        ret    ;显示字符串的子程序[定义结束]


code ends

end start
hsly
[第1楼]   [ 回复时间:2020-12-16 00:25 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2008-10-23 11:15
我也是DEBUG正常 运行就死循环  头疼
codinv
[第2楼]   [ 回复时间:2022-07-18 22:42 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2018-10-13 21:08
我也,debug发现没问题,直接运行exe就死循环(`・ω・´)
codinv
[第3楼]   [ 回复时间:2022-07-18 22:49 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2018-10-13 21:08
assume cs:code
data segment
        db 10 dup (0)
data ends
code segment
start:
                mov ax,12666
                mov bx,data
                mov ds,bx
                mov si,0
                call dtoc

                mov dh,8
                mov dl,3
                mov cl,2
                call show_str

                mov ax,4c00h
                int 21h

dtoc:
                push ax
                push bx
                push cx
                push dx
                push si
                push di

                mov bx,0ah
                mov di,1
dtoc_st:
                div bx
                mov cx,ax

                add dl,30h
                mov dh,0
                push dx

                jcxz dtoc_ok
                mov ax,cx
                mov dx,0
                inc di
                jmp dtoc_st
dtoc_ok:
                mov cx,di
dtoc_s:        pop dx
                mov byte ptr [si],dl
                inc si
                loop dtoc_s
                mov byte ptr [si+1],0

                pop di
                pop si
                pop dx
                pop cx
                pop bx
                pop ax
                ret

;317a  4f2...6
;4f2   7e....6
;7e    c.....6
;c     1.....2
;1     0.....1

show_str:
                push dx
                push si
                push cx

                mov ax,0b800h
                mov es,ax

                mov cl,dh
                mov ch,0
                jcxz set_cols
                mov bx,0
set_rows:
                add bx,0a0h
                loop set_rows
set_cols:
                mov cl,dl
                mov ch,0
                jcxz set_str
        s:        add bx,2
                loop s

                mov di,0
set_str:
                mov cl,[si]
                mov ch,0
                jcxz ok
                mov es:[bx][di],cl
set_color:
                pop cx
                mov es:[bx][di+1],cl
                push cx
                inc si
                add di,2
                jmp set_str

        ok:        
                pop cx
                pop si
                pop dx
                ret

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