. : : Assembly Language : : .  |  首页  |  我提出的问题  |  我参与的问题  |  我的收藏  |  消息中心   |  游客  登录  | 
刷新 | 提问 | 未解决 | 已解决 | 精华区 | 搜索 |
  《汇编语言》论坛 ->CALL和RET指令
  管理员: assembly   [回复本贴] [收藏本贴] [管理本贴] [关闭窗口]
主题 : :  第十章第三个实验为什么在0行3列到0行15列会有乱码显示?请高手帮我看下  [待解决] 回复[ 2次 ]   点击[ 362次 ]  
hualongmian
[帖 主]   [ 发表时间:2008-05-27 13:37 ]   [引用]   [回复]   [ top ] 
荣誉值:6
信誉值:0
注册日期:2008-05-13 20:29
assume cs:code
data segment
db 16 dup (0) 
data ends
stack segment
dw 16 dup (0)
stack ends
code segment
start:  mov ax,12666
        mov bx,data
        mov ds,bx
        mov bx,stack
        mov bx,0b800h
        mov es,bx
        mov ss,bx
        mov sp,32
        mov si,0
        call dtoc
        mov dh,8
        mov dl,3
        mov cl,2 ;给show_str子函数设置显示参数。
        call show_str ;调用子函数用来显示。
        mov ax,4c00h
        int 21h

dtoc:   push ax
        push bx
        push cx
        push dx
                
        mov bx,0  ;将bx置为0,来做后面的出栈计数器

        mov ax,12666
        mov dx,0
 dt_s:        mov cx,10  ;设置将要转换的进制,此处是十进制
        call divdw ;调用divdw来进行除法运算。
        add cx,30h ;转换为字符形式
        push cx    ;将字符压栈。
        inc bx           ;计数器加一。
        mov cx,ax
        jcxz dt_s0
        inc cx
        loop dt_s
   
   divdw:  push bx
           mov bx,ax   ;将低16位暂存
           mov ax,dx
           mov dx,0
           div cx    ;进行高16位除法运算
           push ax   ;将高16计算的结果暂存
           mov ax,bx ;将低16位送入ax中,好进行低16位的除法运算。
           div cx    ;进行低16位的除法运算(dx中存有高16位的余数),计算后(ax)为返回值。
           mov cx,dx ;将余数返回。
           pop dx    ;将运算总结果的高16位返回。
           pop bx
           ret             ;子程序返回
        
 dt_s0:        mov cx,bx  ;将记录的入栈次数送入cx
        dec bx           ;将计数器bx减一操作。
        pop [si]
        inc si
        loop dt_s0        
        
        pop dx
        pop cx
        pop bx
        pop ax
        ret

show_str: push ax
          push bx
          push cx
          push dx
          push si   ;将用到寄存器入栈暂存。   
          mov al,160
          mul dh
          add dl,dl       
          add al,dl   ;此三步定位显示的地址,dh,dl在这里做参数好似坐标轴一样。
          mov bx,ax   ;将显示地址送入bx寄存器。
          mov ah,cl   ;将颜色参数送入字符中。
          mov si,0
          mov ch,0
  sh_s:          mov al,[si] ;将字符串送入al中。
          mov cl,al
          mov es:[bx],ax ;将字符串显示出来。
          jcxz sh_s0
          inc cl   ;防止ds:[si]刚好为01时,loop无法循环。
          inc si ;指向下一个字符
          add bx,2 ;将显示单元指向下一个位置。
          loop sh_s
  sh_s0:  pop si
          pop dx
          pop cx
          pop bx
          pop ax
          ret
code ends
end start
开始我没有调用divdw子函数来做除法运算,但是还是有乱码显示。
程序没有错呀,为什么会有乱码显示咧?
sysnap
[第1楼]   [ 回复时间:2008-05-29 09:10 ]   [引用]   [回复]   [ top ] 
荣誉值:32
信誉值:0
注册日期:2008-01-15 12:22
mov bx,stack 
    mov bx,0b800h 
    mov es,bx 
    mov ss,bx 
--------------
这是程序段开始的设置,我怎么感觉怪怪的,把stack的地址给bx没有用啊,bx的值在mov bx,0b800h处又改了,改成了显存的段地址,显然程序运行后的乱码也是因为这样设置的过。
hualongmian
[第2楼]   [ 回复时间:2008-05-29 10:22 ]   [引用]   [回复]   [ top ] 
荣誉值:6
信誉值:0
注册日期:2008-05-13 20:29
额,是呵~大意了,现在逛论坛后,我感觉把显示地址段0b800在子程序show_str当中定义更加合理。
需要登录后才能回帖 -->> 请单击此处登录
    Copyright © 2006-2024   ASMEDU.NET  All Rights Reserved