将内存中的数字转换成字符串并保存于内存中,随后将转换好的字符串输出到屏幕上(汇编)

;object: change number to string and put teh string to the screen
;writer: mike
;time: 2020.11.02


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


data segment
        dw 1234

data ends

data1 segment
        db '0000000000',0
data1 ends

stack segment stack
        db 30 dup(0)


stack ends

code segment
        ;数据从哪里来        
start:        mov ax,data
        mov ds,ax
        mov si,0
        ;数据到那里去    
        mov ax,data1
        mov es,ax
        mov di,10    ;从最后一位开始输入
        
        mov ax,ds:[si]   ;将内容放到寄存器,用于除法
        mov dx,0

        call shortDiv  ;调用函数


        mov bx,data1    ;将内存中的字符串显示在屏幕上
        mov ds,bx       ;数据从哪里来
        mov si,di       ;其实di是1

        mov bx,0B800H    ;数据到那里去,显示在屏幕上
        mov es,bx
        mov di,160*10
        add di,40*2

        call showString
        
        mov ax,4c00H
        int 21H

;===================================
shortDiv:      mov cx,10
        div cx        ;结果放在ax中
        add dl,30H     ;将余数数字,变成数字字符串,这里用的是16位除法,这里cx是16位
        sub di,1       ;修改栈顶标记    
        mov es:[di],dl   ;将结果放进内存
            
        mov cx,ax          ;jcxz比较的是cx
        jcxz shortDivRet  ;比较商是不是得零


        mov dx,0          ;如果商不是零,也就是没有除到最后,重新将余数存储器归为0
        jmp shortDiv      ;重新循环程序,这里ax默认已经放上了除法之后的商。

shortDivRet:      ret    
        
;=======================================    

showString:    push cx
        push ds
        push si
        push es
        push di               ;将寄存器入栈
        
        mov cx,0               ;初始化cx    
        
showString1:    mov cl,ds:[si]         ;检查是否到字符串的最后
        jcxz showStringRet     
        mov es:[di+0],cl         ;将内存中的字符串送到屏幕上
        mov byte ptr es:[di+1],00000010B   ;给字符串加上颜色
        add di,2             ;不明白为什么是加2? 
        inc si
        jmp showString1

showStringRet:  pop di
        pop es
        pop si
        pop ds
        pop cx

        ret

code ends
end start
end

 

 

posted @ 2020-11-03 22:39  看星星的派大星  阅读(507)  评论(0编辑  收藏  举报