鱼C论坛

 找回密码
 立即注册
查看: 2843|回复: 4

[汇编作业] 实验10的三个小程序

[复制链接]
发表于 2020-4-10 13:19:16 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 何足道 于 2020-4-10 13:25 编辑

初学者写了几个小时才调试通过,第三个小程序包括前两个,所以就发第三个吧。
编写过程没看甲鱼哥和任何答案,所以思路和一些细节可能和别人不一样,欢迎大家批评指正。
assume cs:code,ds:data
data segment
        db 10 dup (0)
data ends

code segment
start:
        mov ax,data
        mov ds,ax
        mov si,0                                        ;data字符串首地址为ds:si
        
        mov ax,12666
        call dtoc        
        
        mov dh,8                                        ;行号为8(0~24)
        mov dl,3                                        ;列号为3(0~79)
        mov cl,2                                        ;绿色 (绿字00000010b; 绿底红字:00100100b; 白底蓝字:01110001b)        
        call show_str
        
       mov ax,4c00H
       int 21h 

;数值显示
;功能: 将word型数据转变为十进制的字符串,字符串以0为结尾符。
;参数: (ax)=word型数据; ds:si指向字符串首地址
;返回: 无
dtoc:
        push cx
        push bx
        push dx        
        push ax
        push di
        push si
        
        mov di,0                                        ;di记录位数        
d:     mov cx,10
        mov dx,0                                        ;初始化divdw的参数
        call divdw                                        ;(ax)=int,(cx)=rem
        inc di                                        ;位数++        
        add cx,30h                                ;余数+30h转为ASCII码串
        push cx                                        ;将各位对应的ASCII码串倒序入栈
        mov cx,ax
        jcxz ok1                                        ;商为0则结束
        jmp short d
        
        ok1:        mov cx,di        
                        s:      pop ax                ;循环di次,顺序出栈
                                mov [si],al
                                inc si
                                loop s
                        mov byte ptr [si],0        ;字符串结尾补0
                        
                        pop si
                        pop di
                        pop ax                        
                        pop dx
                        pop bx
                        pop cx
                        ret

;显示字符串
;功能: 在指定位置用指定颜色显示一个用0结束的字符串
;参数: (dh)=行号(0~24),(dl)=列号(0~79),(cl)=颜色,ds:si指向字符串首地址        
;返回: 无
show_str:        
        push ax
        push es
        push di
        push cx
        
        mov ax,0B800H
        mov es,ax                                 ;显示位置为es:di
        mov al,160                                ;di=160*(dh-1)+2*(dl-1)=160*dh+2*dl-162
        mul dh
        mov di,ax
        mov al,2
        mul dl
        add di,ax
        sub di,162        ;根据公式得到di
        
        show:        mov cl,[si]
                        mov ch,0
                        jcxz ok                        ;判断字符是否为0
                        
                        mov al,[si]
                        mov es:[di],al                ;写入字符
                        inc si
                        inc di
                        
                        pop cx
                        mov byte ptr es:[di],cl        ;写入字符属性(颜色)
                        push cx
                        
                        inc di
                        jmp short show
                        
        ok:           pop cx
                        pop di
                        pop es
                        pop ax
                        ret        

;解决除法溢出的问题
;功能: 进行不会溢出的除法运算,被除数dword型,除数word型,结果dword型
;参数: (dx)=被除数高16位,(ax)=被除数低16位,(cx)=除数
;返回: (dx)=结果的高16位,(ax)=结果的低16位,(cx)=余数
divdw:
        push bx
        push bp
        mov bx,dx        ;bx暂存高16位
        mov bp,ax        ;bp暂存低16位
        
        mov dx,0
        mov ax,bx
        div cx        
        push ax                ;(ax)=int(H/N),(dx)=rem(H/N)
        
        mov ax,bp
        div cx
        mov cx,dx        ;rem(X/N)
        pop dx                ;将int(H/N)给dx
                
        pop bp
        pop bx
        ret
        
code ends
end start

                               
登录/注册后可看大图


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

使用道具 举报

 楼主| 发表于 2020-4-10 13:20:57 | 显示全部楼层
图片补充:

                               
登录/注册后可看大图


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

使用道具 举报

 楼主| 发表于 2020-4-10 13:22:10 | 显示全部楼层

                               
登录/注册后可看大图

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

使用道具 举报

发表于 2020-4-10 13:24:10 | 显示全部楼层

看不到
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-4-10 13:27:49 | 显示全部楼层

我也不知道为什么看不到,系统显示在审核,发图片好麻烦。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-12-24 09:23

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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