王爽《汇编语言》显示字符串、除法溢出、数值显示程序

assume cs:code,ds:data
data segment
	db 16 dup (0)
data ends

code segment	
start: 	
	mov ax,3000
	mov dx,20000
	mov bx,data
	mov ds,bx
	mov si,0
	
	call dtoc
	
	mov dh,4	;行号
	mov dl,4	;列号
	mov cl,07h      ;背景色	
	call show_str
	
	mov ax,4c00h
	int 21h
;子程序描述
;名称:dtoc
;功能:将dword型数据转换为表示为十进制数的字符串,字符串以0为结尾符
;参数:(ax)=dword型数据低16位
;     (dx)=dword型数据高16位
;     ds:si指向字符串的首地址
;返回:无

dtoc:
	push ax
	push dx
	push cx
	push si
	push bx
	
	mov bx,0		;记录字符串数量
dtoc_1:
	mov cx,ax
	or cx,dx		;判断dword数据是否为0
	jcxz dtoc_2
	mov cx,10	
	call divdw		;进行dword除法
	add cx,30H		;对字符加30H,转换为字符
	inc bx
	push cx			;对转换后的字符压栈
	jmp short dtoc_1	
dtoc_2:
	mov cx,bx		;判断字符数量是否为0,防止出现初始数字为0栈溢出的情况
	jcxz dtoc_ok	
dtoc_3:
	pop bx			;字符出栈
	mov ds:[si],bl
	inc si
	dec cx
	jcxz dtoc_ok
	jmp short dtoc_3
dtoc_ok:
	mov byte ptr ds:[si],0
	pop bx
	pop si
	pop cx
	pop dx
	pop ax
	ret

;子程序描述
;名称:divdw
;功能:进行不产生溢出的除法运算,被除数dword型,除数word型,结果为dword型
;参数:(ax)=被除数低16位,(dx)=被除数高16位,(cx)=除数
;返回:(ax)=结果的低16位,(dx)=结果的高16位,(cx)=余数
divdw:
    push bx
    push ax        
    ;div操作时,dx存高16位,ax存低16位,除法后,ax存储商,dx存储余数
    mov ax,dx        ;设置被除数的高16位0,低16位为dx中的值,实现H/N
    mov dx,0        
    div cx           ;计算int(H/N)*65536
    mov bx,ax        ;保存int(H/N)到bx,将rem(H/N)保存至dx
    
    pop ax           ;出栈ax(即L),准备计算[rem(H/N)*65536+L]/N    
    div cx           ;除法后,ax保存为商
    mov cx,dx        ;将除法余数保存至cx中
    mov dx,bx        ;将int(H/N)保存至dx

    pop bx
    ret
;子程序描述
;名称:show_str
;功能:在指定的位置,用指定的颜色,显示一个用0结束的字符串
;参数:(dh)=行号(取值范围0-24),(dl)=列号(取值范围0-79)
;     (cl)=颜色,ds:si指向字符串的首地址
;返回:无
show_str:
	push ax
	push bx
	push es
	push di
	push cx
	push si
	
	mov ax,0B800h
	mov es,ax
	;计算160X+2Y,X行号,Y列号
	mov al,0a0h
	mul dh	   	
	mov bx,ax
	
	mov al,2
	mul dl   			
	add bx,ax	;bx存放显存开始位置
	
	mov di,0
	mov al,cl
	mov ch,0	;高8位为0
show_str_dis:
	mov cl,ds:[si]	;判断是否到了字符结束
	jcxz show_str_ok
	mov es:[bx+di],cl
	mov es:[bx+di+1],al
		
	inc si
	add di,2
	jmp short show_str_dis
show_str_ok:	
	pop si
	pop cx
	pop di
	pop es
	pop bx
	pop ax
	ret
code ends
end start
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值