鱼C论坛

 找回密码
 立即注册
查看: 3628|回复: 1

[学习笔记] 《王爽汇编》第十章实验10-3

[复制链接]
发表于 2018-5-22 14:41:12 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

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

这次用了不少时间,但也算理解的更透彻了一些。
;名称: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 [si],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,[si]
                mov es:[di],al
                mov es:[di+1],bl

                mov cl,[si]
                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

评分

参与人数 1荣誉 +5 鱼币 +5 贡献 +3 收起 理由
虫虫-中中(无忧) + 5 + 5 + 3 感谢楼主无私奉献!

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-1-8 00:21:49 | 显示全部楼层
感谢朋友  你解决了我遇到的一个重大问题:

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

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

看到你的以子程序名为前缀,给子程序标号进行命名的方法,我恍然大悟,终于知道该怎么解决标号冲突的问题了!!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-10-2 23:28

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表