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大小,这样就可以显示更多的字符了。做了这题花了我三个多小时。?