leader4 发表于 2018-5-22 14:41:12

《王爽汇编》第十章实验10-3

虽然看起来简单,但真做起来还是有不少问题的。
比如出栈入栈的计数一开始就没有想到。
比如要注意子程序之间寄存器值的相互干扰。。
比如要写好注释,之前写的代码因为没有注释,已经不知道是干什么的了。。

这次用了不少时间,但也算理解的更透彻了一些。

;名称:dtoc
;功能:将word型数据转变为表示十进制的字符串,字符串以0为结尾符号。
;参数:(ax)=word型数据
;          ds:si指向字符串的首地址
;返回:无
;
;思路:取一个16进制数,连续除以10,余数的倒序就是10进制数。
;          每个余数+30H就是对应ascii码。


assume cs:code

data segment
        dw 123,12666,1,8,38
data ends

code segment
start:        mov ax,12666
                  mov bx,data
                  mov ds,bx
                  mov si,0                ;设置ds:si
       
                  call dtoc                ;进制转换

                mov dh,8
                mov dl,3
                mov cl,2
                call show_str        ;显存写入

                mov ax,4c00h
                int 21h

dtoc:
        push cx
        push si
        push dx

        mov si,0                ;余数计数
        mov bx,10                ;除数
dtoc_s0:
        mov dx,0
        div bx
        mov cx,ax
        add dx,30h
        jcxz dtoc_ok
        push dx
        inc si
        jmp dtoc_s0
       
dtoc_ok:
        push dx
        inc si

        mov cx,si
        mov si,0
dtoc_ok_s1:                        ;出栈
        pop ax
        mov ,al
        inc si
        loop dtoc_ok_s1

        pop dx
        pop si
        pop cx
        ret       

show_str:                        ;显示字符的子程序
                push ax
                push bx
                push cx
                push dx
                push si

                ;计算行号
                dec dh
                mov ax,0a0h
                mul dh
                mov bx,ax

                ;计算列号
                mov ax,2
                mul dl
                sub ax,2

                ;行号+列号
                add ax,bx

                ;计算显存首地址
                mov bx,8000H
                add ax,bx
                mov di,ax
                mov ax,0b000H
                mov es,ax        ;es:di

                ;写入数据
                mov bl,cl
                mov ch,0
show_str_s0:

                mov al,
                mov es:,al
                mov es:,bl

                mov cl,
                jcxz show_str_s1

                inc si
                add di,2
                jmp short show_str_s0

show_str_s1:
                pop si
                pop dx
                pop cx
                pop bx
                pop ax
                ret
code ends
end start

虫虫-中中(无忧) 发表于 2019-1-8 00:21:49

感谢朋友你解决了我遇到的一个重大问题:

子程序show_str 与子程序 dtoc分别独立编写的时候标号我都以随性的命名方法 想到什么就写成什么

结果俩个子程序放到一块的时候有部分标号重复 造成编译错误

看到你的以子程序名为前缀,给子程序标号进行命名的方法,我恍然大悟,终于知道该怎么解决标号冲突的问题了!!
页: [1]
查看完整版本: 《王爽汇编》第十章实验10-3