王爽汇编语言实验十第三题

7 篇文章 0 订阅
6 篇文章 0 订阅
comment !
	数值显示,将data段中的数据以十进制的形式显示出来
!
assume cs:code,ds:data,ss:stack
data segment
	dw 123,12666,1,8,38,55,6,77,78,89
data ends
ascii segment
	dw 32 dup(0)
ascii ends
stack segment
	dw 10000 dup(0)
stack ends
code segment
start:		mov ax,data
			mov ds,ax
			mov si,0	;字符串首地址 ds:si
			
			mov ax,ascii
			mov es,ax
			mov di,0	;ascii存放的内存空间
			
			mov ax,stack
			mov ss,ax
			mov sp,0FFFFH
			
			call far ptr dtoc 	;子程序:将字符串在屏幕上以十进制输出。
			mov dh,8	;行号
			mov dl,3	;列号
			mov cl,2	;字体颜色
			call far ptr show_str
			
			mov ax,4c00H
			int 21H
			
dtoc:		push si
			push di
			
action:		mov bp,0		;清空记录入栈的次数
			mov ax,ds:[si]	;将第一个字符串取出来放到ax中
			mov cx,ax		;判断一下是否已经取完最后一个字符串。
			jcxz return		;如果已经取完字符串,那么跳转到标号处 
convert:	mov dx,0		;将dx置为0,以便取字符串的余数。
			mov bx,0AH		;除数,用于求出余数。
			div bx			;求出余数
			add dx,30H
			push dx			;将转换后的ascii码压入栈中。
			inc bp			;记录几次入栈。
			mov cx,ax
			jcxz MovAscii	;判断一个字符串是否转换完,如果转换完就跳转到MovAscii标号。
			jmp convert	;跳转到convert将字符串逐个转换完。
			
MovAscii:	mov cx,bp
l1:			pop ax
			mov es:[di],al
			inc di
			loop l1
			mov al,20H
			mov es:[di],al
			inc di
			add si,2
			jmp action
			
return:		
			
			pop di
			pop si
			
			mov ax,ascii
			mov ds,ax
			mov di,0	;ascii存放的内存空间
			retf 
			
show_str:	mov ax,0B800H
			mov es,ax
			mov di,0	;设置es:di指向显存地址
			
			mov ah,0
			mov al,cl	;颜色存放到al中
			push ax		;将颜色入栈
			mov al,dl	;列号存放到al中
			push ax		;将列号入栈
			mov al,dh	;将行号存放到al中
			
			mov	ch,0A0H	;行数
			mul ch		
			sub ax,0A0H	;求出行号的首地址
			
			pop dx		;从栈中取出列号
			dec dx	
			add dx,dx	;求出列号的首地址
			add ax,dx	;求出几行几列的首地址
			mov di,ax	;设置显存的起始地址
			
			pop ax		;从栈中取出颜色
			
j1:			mov cl,ds:[si]	;取字符串的第一个字符放到ah中
			mov es:[di],cl	;将ah中的数据存放到显存处,用于显示字符
			mov es:[di+1],al	;将字符颜色存放到显存
			inc si
			add di,2
			mov ch,0
			jcxz return2	;判断是否取到最后一个字符0.为0则结束程序,不为0则继续向下取
			jmp short j1	
			
return2:	retf			
			
			
code ends
end start

我将栈设置为64kb大小,这样就可以显示更多的字符了。做了这题花了我三个多小时。?

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值