|
主题 : : 显示数值,先发出来再分析一下别人的吧。求点评! [待解决] |
回复[ 1次 ]
点击[ 190次 ] | |
|
|
|
|
[帖 主]
[ 发表时间:2013-01-12 15:16 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2013-01-10 18:38 |
assume cs:code ss:stack
data segment
db 10 dup (0)
ends data
stack segment
dw 32 dup (0) ;自己要栈是个好习惯!
ends stack
code segment
start:mov ax,12666
mov bx,data
mov ds,bx
mov si,0
mov bx,stack
mov sp,32
call dtoc
mov dh,8
mov dl,3
mov cl,2
mov ax,data
mov ds,ax
call show_str
mov ax,4c00h
int 21h
dtoc:pusha ;保存现场,这个命令是各种寄存器都入栈(push all reg sreg),省的一个一个写push ax、push bx、push cx………….
xor di,di ;(作为保存ax的计数器)
;------对除法溢出的处理-----------
nook:mov bl,10 ;bl为除数
mov bh,al ;把al保存一下
mov al,ah ;高低互换
xor ah,ah ;高位清零
div bl ;ah得出高位余数
mov dl,al ;dl保存商
mov al,bh ;恢复低位
div bl ;ah得出最终余数
;---------------------------------
push ax ;保存ax值(ah为余数,al为商)
inc di ;每次执行push ax后加一
mov ah,dl ;dl恢复商
xor ch,ch
mov cl,al
jcxz ok ;判断一下是否除好
jmp nook ;没好继续
ok: mov cx,di ;出栈多少次
pop ax ;出栈ax
add ah,30h ;加30h转换字符
mov [si],ah;送到ds:si
inc si ;[si]加一
dec di ;di减一
loop ok ;cx得零就好
over:popa ;恢复现场 (pop all reg sreg)
ret
;----------------------------------------------------------
;名称:show_str
;功能:在指定的位置,用指定的颜色,显示一个用0结束的字符串.
;参数:(dh)=行号(取值范围0-24),(dl)=列号(取值范围0-79).
; (cl)=颜色, ds:si指向字符串的首地址
;返回:无
;应用举例:在屏幕的8行3列,用绿色显示data段中的字符串.
;----------------------------------------------------------
show_str:pusha ;保存现场
mov ax,0b800h
mov es,ax
mov al,160
dec dh
mul dh
mov bx,ax
mov al,2
mul dl
sub ax,2
mov di,ax
mov al,cl
mov cl,0
s: mov ch,[si]
jcxz s1
mov es:[di+bx],ch
mov es:1[di+bx],al
inc si
add di,2
jmp s
s1: popa ;恢复现场
ret
ends code
end start | | |
|
|
|
|
[第1楼]
[ 回复时间:2013-01-12 15:27 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2013-01-10 18:38 |
痩身版:
assume cs:code ss:stack
data segment
db 10 dup (0)
ends data
stack segment
dw 32 dup (0) ;自己要栈是个好习惯!
ends stack
code segment
start:mov ax,12666
mov bx,data
mov ds,bx
mov si,0
mov bx,stack
mov sp,32
call dtoc
mov dh,8
mov dl,3
mov cl,2
mov ax,data
mov ds,ax
call show_str
mov ax,4c00h
int 21h
dtoc:pusha ;保存现场,这个命令是各种寄存器都入栈(push all reg sreg),省的一个一个写push ax、push bx、push cx………….
xor di,di ;(作为保存ax的计数器)
nook:mov bx,10 ;bx为除数
xor dx,dx ;清零做32位出发思密达~
div bx
push dx ;保存dx值
inc di ;每次执行push dx后加一
mov cx,ax
jcxz ok ;判断一下是否除好
jmp nook ;没好继续
ok: mov cx,di ;出栈多少次
pop dx ;出栈dx
dec di ;di减一
add dl,30h ;加30h转换字符
mov [si],dl;送到ds:si
inc si ;[si]加一
loop ok ;cx得零就好
over:popa ;恢复现场 (pop all reg sreg)
ret
;----------------------------------------------------------
;名称:show_str
;功能:在指定的位置,用指定的颜色,显示一个用0结束的字符串.
;参数:(dh)=行号(取值范围0-24),(dl)=列号(取值范围0-79).
; (cl)=颜色, ds:si指向字符串的首地址
;返回:无
;应用举例:在屏幕的8行3列,用绿色显示data段中的字符串.
;----------------------------------------------------------
show_str:pusha ;保存现场
mov ax,0b800h
mov es,ax
mov al,160
dec dh
mul dh
mov bx,ax
mov al,2
mul dl
sub ax,2
mov di,ax
mov al,cl
mov cl,0
s: mov ch,[si]
jcxz s1
mov es:[di+bx],ch
mov es:1[di+bx],al
inc si
add di,2
jmp s
s1: popa ;恢复现场
ret
ends code
end start | | |
|