ckzmo 发表于 2011-3-5 16:05:40

实验10.3代码

本帖最后由 ckzmo 于 2011-3-6 13:11 编辑

题目就是吧12666显示在8行3列绿字
终于调试出来了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 bx
              
s:    mov dx,0
         mov cx,10d
         div cx
         mov cx,ax
       jcxz t
       add dx,30h
       mov ds:,dx
       push dx
       inc si
       mov bx,si
       jmp short s
                
   t:   add bx,1
      mov cx,bx
      mov si,0
        add dx,30h
       
s1: mov ds:,dx
      pop dx
      inc si
        loop s1
       
        mov si,0
        ret
       
show_str:mov al,0a0h
                dec dh
                mul dh
                mov bx,ax
               
                mov al,2
                mul dl
                sub ax,2
                add bx,ax
         
               mov dx,0b800h
               mov es,dx
                      
               mov di,0
               mov al,cl
         
s2:mov cl,ds:
       mov ch,0
       jcxz x
       mov es:,cl               
       mov es:,al
       inc si
       add di,2
       jmp short s2
       
        x:ret
       
code ends
end start

木吉他 发表于 2011-3-5 22:44:18

首先
mov ax,4c00h
int 21h ;少了个h

不过通过了没正常显示.再看看.

china0008 发表于 2011-3-5 23:00:56

本帖最后由 china0008 于 2011-3-5 23:52 编辑

源码来了。你自己分析下。
有疑问再提问。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
        mov bx,0
zh: mov cx,10
        mov dx,0
        div cx
        add dx,30h
        push dx
        inc bx
        mov cx,ax
        inc cx       ;针对首位为1的数值对循环次数的影响。其他首位值不受影响。
        loop short zh
    mov cx,bx    ;把显示数值的位数传递给cx
        mov si,0
px: pop ax      
    mov ,al
        inc si
        loop short px
       
        pop si
        pop dx
        pop cx
        pop bx
        pop ax
        ret
               
show_str:            ;提供 行/列/属性   即可显示
          push cx
          push si
          mov ax,0b800h
          mov es,ax      ;显存0页段地址
          dec dh
          dec dl         ;因为行列都是从0开始数。所以行和列都减1
          mov al,160
          mul dh
          mov bx,ax
          mov al,2
          mul dl
          add bx,ax      ;计算首字地址
          mov di,0         ;显存偏移变量
          mov al,cl
          mov ch,0         ;用al存储显示属性,CX用于显示字符和判断0的出现。
        s:mov cl,ds:
      jcxz ok
          mov es:,cl
          mov es:,al
          inc si
          add di,2      
      jmp short s
   ok:pop si
      pop cx
      ret
code ends
end start

木吉他 发表于 2011-3-5 23:57:29

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 bx
        push si
            
s:   
        mov dx,0      ;s循环是把12666分别除以10取的余数放进ds:中
        mov bx, 0aH
        div bx
        add dx, 30H
        push dx
        mov cx, ax
        inc di
        jcxz t
        jmp s
               
t: mov cx, di         ;要循环的次数给CX

s1:
                                        ;S1循环就是把DS:中的数加上30H
        pop dx
        mov , dl
        inc si
        loop s1
        mov dl, 0
        mov , dl
      
        pop si                                       
        pop bx
      
        ret
      
show_str:
        mov al,0a0h
        ;dec dh                                          ;行
        mul dh
        mov bx,ax

        mov al,2                                     ;列
        mul dl
        ;sub ax,2
        add bx,ax


        mov dx,0b800h
        mov es,dx
               
        mov di,0
        mov ah,cl

        s2:mov cl,ds:
        mov ch,0
        jcxz x
        mov al,ds:
        mov es:,ax               
        ;mov es:,al
        inc si
        add bx,2
        jmp short s2

        x:ret
      
code ends
end start

木吉他 发表于 2011-3-6 00:05:35

哎呀,12点了.改了一个小时,技术差....有几句偶不明白的地方,给你注释掉了.用栈的方式存储,其他的地方没动.
其实ds:,默认关联的.不需要显示表示,直接就可以的吧
上面版主也给了代码了.

ckzmo 发表于 2011-3-6 13:12:51

我的答案编辑在1楼了 谢谢版主的帮忙
页: [1]
查看完整版本: 实验10.3代码