|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
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
复制代码
|
|