. : : Assembly Language : : .  |  首页  |  我提出的问题  |  我参与的问题  |  我的收藏  |  消息中心   |  游客  登录  | 
刷新 | 提问 | 未解决 | 已解决 | 精华区 | 搜索 |
  《汇编语言》论坛 ->CALL和RET指令
  管理员: assembly   [回复本贴] [收藏本贴] [管理本贴] [关闭窗口]
主题 : :  显示数值,先发出来再分析一下别人的吧。求点评!  [待解决] 回复[ 1次 ]   点击[ 190次 ]  
panna
[帖 主]   [ 发表时间: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
panna
[第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
需要登录后才能回帖 -->> 请单击此处登录
    Copyright © 2006-2024   ASMEDU.NET  All Rights Reserved