. : : Assembly Language : : .  |  首页  |  我提出的问题  |  我参与的问题  |  我的收藏  |  消息中心   |  游客  登录  | 
刷新 | 提问 | 未解决 | 已解决 | 精华区 | 搜索 |
  《汇编语言》论坛 ->CALL和RET指令
  管理员: assembly   [回复本贴] [收藏本贴] [管理本贴] [关闭窗口]
主题 : :  实验10 数值显示,完整版  [待解决] 回复[ 1次 ]   点击[ 322次 ]  
byunting
[帖 主]   [ 发表时间:2011-07-06 10:45 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2011-04-10 01:12
虽然有点复杂,寄存器也用的有点多,但确实是完整的
data segment
        db 100 dup(0)
data ends

stack segment
        dw 8 dup(0) 
stack ends

code segment
    assume cs:code,ds:data,ss:stack

;*********************************************************************************
参数:ax        传入要输出的值

;************    
PRINTSTRING:                        ;*************
                                将用到的寄存器压栈
            push ax
            push bx
            push cx
            push dx
            push si
            push di
            push es
                                    ;*************
            mov bx,10                ;得到一串ascii码。注意是倒叙的,接下来大部分代码都是完成正序输出的
            mov di,0
          k:mov cx,ax
            jcxz JGETN
            mov dx,0
            div bx
            add dl,'0'
            mov [di],dl
            inc di
          jmp short k
                                    ;*************        
          JGETN:mov si,0        ;完成统计字符串中字符个数(不含结束符0),si指向字符串首地址;al统计个数
                mov al,0
          GETN: mov cl,[si]
                mov ch,0
                jcxz PRINT
                inc al
                inc si
          jmp short GETN
                                   ;*************
          PRINT:mov ah,0        ;在输出之前设置各个寄存器的值以打印
                mov si,ax
                dec si
                mov cx,ax
                mov ax,0b800H
                mov es,ax
                mov di,0
                                   ;*************        
                                ;开始输出,从最后一个字符开始,依次向前
               P:mov al,[si]
                 mov ah,00000111B
                 mov es:[di],ax
                  add di,2
                 dec si
                 loop P
         return:                ;*************
                                将用到的寄存器出栈
                    push es
                    push di
                    push si
                    push dx
                    push cx
                    push bx
                    push ax
                                    ;*************
                ret                ;返回主程序
;*********************************************************************************     
start:
    mov ax,data
    mov ds,ax
    mov ax,stack
    mov ss,ax
    mov sp,10H
    
    mov ax,12666
    call PRINTSTRING                ;得到这个整数的ascii码并写到data段中
   
    mov ah,4ch
    int 21h
code ends
end start
byunting
[第1楼]   [ 回复时间:2011-07-06 10:50 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2011-04-10 01:12
不好意思,return那边的不是push而是pop
失误
需要登录后才能回帖 -->> 请单击此处登录
    Copyright © 2006-2024   ASMEDU.NET  All Rights Reserved