+ -
当前位置:首页 → 问答吧 → 一道课后题---字符显示的新手问题

一道课后题---字符显示的新手问题

时间:2011-11-13

来源:互联网

在其他论坛看到的问题,解决不了,用于显示字符,代码如下:
Assembly code

assume    cs:code;实验10.1
data     segment
    db 'welcome to masm!', 0
data     ends

code     segment
start:     mov dh, 15;
           mov dl, 12;
           mov cl, 2
           mov ax, data
           mov ds, ax
           mov si, 0
           call show_str    
    
    mov ax, 4c00h
    int 21h

show_str:   mov ch, 0
      mov al, 2
      mul dl
      mov di, ax
      mov al,0A0h
      mul dh
      mov bx, ax
      mov ax, 0b800h
      mov es, ax
s:    push cx;感觉这边cx压栈和后面的出栈有问题,但是不懂为什么
      mov es:[bx+di+1], cl
      mov cl, [si]
      jcxz ok
      mov es:[bx+di], cl
      inc si
      add bx, 2
      pop cx
      jmp s

ok: 
       ret    

code     ends

end    start 


单步调试的时候发现在 pop cx之后的mov语句总是不正确,显示要mov的值为F0,但cx寄存器的值还是0020h
不懂这是为什么,谢谢大家帮忙~~
人穷,分就少一点了~

作者: hakuabby   发布时间: 2011-11-13

写少了一点,栈空间申请和初始化为:
stack segment
db 16 dup(0)
stack ends

mov ax,stack
mov ss,ax
mov sp,16

作者: hakuabby   发布时间: 2011-11-13

我把你的程序执行了下,可以正常显示字符串,没有什么问题

作者: abgood   发布时间: 2011-11-13

Assembly code

;原程序写得没章法,也没个注释,让人看不懂
;下面的程序等价LZ的程序
;功能:在屏幕上指定位置和指定颜色输出一个串。

stack segment para stack 'STACK'
    db 16 dup(0)
stack ends 
assume    cs:code;实验10.1

data     segment
    db 'welcome to masm!', 0
data     ends

code     segment
start:
        mov ax, data    ;首先应是初始化要用的段址寄存器
        mov ds, ax        ;dx = ax 
        mov ax, 0b800h    ;
        mov es, ax        ;es = 0b800h

        mov dh, 15 ;
        mov dl, 12 ;
        mov cl, 2  ;颜色值
        mov si, 0  ;要输出字符缓冲区的下标,首地址为0
        
        ;call show_str(原文是子程序,但感觉还不如不用子程序好)
        mov al, 2        ;
        mul dl            ;ax = 2 * 12 = 24
        mov di, ax        ;di = ax = 2 * 12 = 24
        
        mov al,0A0h
        mul dh            ;ax = 0A0h * 15
        mov bx, ax        ;bx = 0A0h * 15 = 150
s:

        mov es:[bx+di+1], cl ;着颜色
        mov al, [si]         ;从字符串读一个字符给al
        test al,al           ;al = 0 ?
        jz ok                ;yes,jump
        mov es:[bx+di], al   ;else copy to screen
        inc si               ;调整串指针指向下一个字节
        add bx, 2            ;
        jmp s
ok:
        ;exit:
        mov ax, 4c00h
        int 21h

show_str:

code    ends
        end start 

作者: gsy999   发布时间: 2011-11-14