. : : Assembly Language : : .  |  首页  |  我提出的问题  |  我参与的问题  |  我的收藏  |  消息中心   |  游客  登录  | 
提问 | 未解决 | 已解决 | 精华区 | 搜索 |
  《汇编语言》论坛 ->CALL和RET指令
主题 : :  数值显示程序为什么不显示,且进入死循环  [待解决] 回复[ 3次 ]   点击[ 222次 ]  
yt2020
[帖 主] [ 发表时间:2020-07-15 14:50 ] 
荣誉值: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
codinv
[第2楼] [ 回复时间:2022-07-18 22:42 ] 
荣誉值:0
信誉值:0
注册日期:2018-10-13 21:08
我也,debug发现没问题,直接运行exe就死循环(`・ω・´)
需要登录后才能回帖 -->> 请单击此处登录
    Copyright © 2006-2024   ASMEDU.NET  All Rights Reserved