给定六个数值 要求以十进制显示在屏幕上
大体思路:首先我们要知道显示在屏幕上是以字符的形式(ascii码),我们首先要将给定的数值一位一位的转换成字符存在一个地方,然后再在屏幕上显示出来
clear_screen:
mov dx,0700h ;相当于黑底空字符
mov cx,2000 ;循环次数
mov bx,0b800h
mov es,bx
mov di,0
clearscreen:
mov es:[di],dx
add di,2
loop clearscreen
ret
设定string段,将每个数值转换成字符,存在其中
init_reg:
mov bx,data
mov ds,bx
mov bx,string
mov es,bx
ret
这个函数的作用就是遍历每个给定的数值
show_number:
mov bx,0
mov si,9 ;es:[si]
mov di,160*10+30*2
mov cx,6
;相当于外循环每次处理一个值
shownumber:
call show_word
add di,160 ;代表屏幕中显示的位置每次加一行
add bx,2 ;代表data段中的数据每次换成下一个数据
loop shownumber
ret
将给定数值存在ax寄存器当中,然后先将ax赋值给cx,然后判断cx是否为0,每次将余数dx存放到string段中
short_div:
mov cx,10 ;除数
div cx
add dl,30h ;dl是余数
mov es:[si],dl ;放到我们设定好的字段
mov cx,ax ;判断是否被除到0
jcxz short_div_ret
dec si
mov dx,0 ;重置dx(做除法时dx会被改变)
jmp short_div
short_div_ret:
ret
将ds寄存器指向初始好的string段,将es寄存器指向屏幕的位置
init_reg_show_string:
mov bx,string
mov ds,bx
mov bx,0b800h
mov es,bx
ret
这时我们si指向的是字符串的最高位,直接输出到值0的位置
show_string:
push cx
push ds
push es
push si
push di
mov cx,0
showstring:
mov cl,ds:[si]
jcxz show_string_ret
mov es:[di],cl
inc si
add di,2
jmp showstring
show_string_ret:
pop di
pop si
pop es
pop ds
pop cx
ret
assume cs:code,ds:data,ss:stack
data segment
dw 1230,12666,1,8,3,38
data ends
string segment ;先将数字放入这个位置
db 10 dup('0'),0
string ends
stack segment stack
db 128 dup(0)
stack ends
code segment
start:
mov ax,stack
mov ss,ax
mov sp,128
call clear_screen
call init_reg ;初始化寄存器
call show_number
mov ax,4c00h
int 21h
;=============================================
clear_screen:
mov dx,0700h ;相当于黑底空字符
mov cx,2000 ;循环次数
mov bx,0b800h
mov es,bx
mov di,0
clearscreen:
mov es:[di],dx
add di,2
loop clearscreen
ret
;=============================================
show_number:
mov bx,0
mov si,9 ;es:[si]
mov di,160*10+30*2
mov cx,6
;相当于外循环每次处理一个值
shownumber:
call show_word
add di,160 ;代表屏幕中显示的位置每次加一行
add bx,2 ;代表data段中的数据每次换成下一个数据
loop shownumber
ret
;=============================================
show_word:
push ax
push bx
push cx
push dx
push ds
push es
push si
push di
mov ax,ds:[bx] ;ax寄存器接收当前值(方便除法)
mov dx,0
call short_div ;对当前值做除法取余转换成字符放到指定字段
call init_reg_show_string ;初始化
call show_string
pop di
pop si
pop es
pop ds
pop dx
pop cx
pop bx
pop ax
ret
;=============================================
show_string:
push cx
push ds
push es
push si
push di
mov cx,0
showstring:
mov cl,ds:[si]
jcxz show_string_ret
mov es:[di],cl
inc si
add di,2
jmp showstring
show_string_ret:
pop di
pop si
pop es
pop ds
pop cx
ret
;=============================================
init_reg_show_string:
mov bx,string
mov ds,bx
mov bx,0b800h
mov es,bx
ret
;=============================================
short_div:
mov cx,10 ;除数
div cx
add dl,30h ;dl是余数
mov es:[si],dl ;放到我们设定好的字段
mov cx,ax ;判断是否被除到0
jcxz short_div_ret
dec si
mov dx,0 ;重置dx(做除法时dx会被改变)
jmp short_div
short_div_ret:
ret
;=============================================
init_reg:
mov bx,data
mov ds,bx
mov bx,string
mov es,bx
ret
code ends
end start