关键是感觉 发表于 2018-7-10 16:08:30

实验十 3.数值显示

分析:
其实就是16进制转为10进制,然后在打印。
按下键盘接收一个字符,进行编码,然后存储在内存。(字符编码后存储,用什么编码方法?ascii),用调速器debug查看都是二进制转为16进制的显示结果,要打印成10进制需要咱们自己转换

123d 十进制对应16进制 7BH
7bH   / 10d = 商ch 余 3
ch   / 10d =商1余 2
1      / 10d =商0   余 1
结果就是321,倒序过来就是123,
assume cs:code,ds:data,ss:stack

stack segment
        db 64 dup (0)
stack ends

data segment
        dw 123,1222,0,88,388,36,3434
data ends

data1 segment
        db 10 dup (0)                                ;转换后保存的的结果
data1 ends

code segment
start:
        mov ax,stack
        mov ss,ax
        mov sp,64
       
        push bp
        mov bp,sp
       
        sub sp,6                                        ;第一个函数参数 function(data1,index,data)
        mov ax,data                                        ;ds,index,es
        mov ,ax
        mov word ptr,0
        mov ax,data1
        mov ,ax
       
       
        sub sp,6                                        ;第二个函数参数        function(cx,行列,0b800h)
        mov dh,10                                        ;行
        mov dl,10                                        ;列
        mov cl,01000010b                        ;颜色
        mov ,0b800h                        ;es 0b800h
        mov ,dx                                ;行列
        mov ,cx                                ;颜色
        mov cx,8
lo:
        push cx
        call calc                                        ;转换字符,保存到data1
        pop cx
        add word ptr,2                ;偏移下一个字
       
        push cx
        call show_string                        ;打印字符串
        pop cx
        mov ah,                                ;打印字符串,下一行
        add ah,1
        mov ,ah

        loop lo
       
        add sp,12                                        ;还原sp
        pop bp
        mov ax,4c00h
        int 21h
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;程序结束
calc:                                                        ;转换字符
        push bp
        mov bp,sp
        mov ax,                                ;读取参数
        mov es,ax
        mov ax,                                ;读取参数
        mov si,ax
        mov ax,                        ;读取参数
        mov ds,ax
       
        push di                                                ;局部变量中需要用到的变量
        sub di,di
        sub dx,dx                                       
        mov ax,ds:
        mov bx,10
lo1:
        div bx
        add dl,30H
       
        push dx
        ;mov byte ptr es:,dl        ;保存结果
        inc di                                                ;次数累计器
        mov cx,ax
        sub dx,dx
        jcxz over_2
        jmp lo1
over_2:
        mov cx,di
        sub di,di
lo2:
        pop dx                                                ;处理倒序字符
        mov byte ptr es:,dl                ;保存结果
        inc di
        loop lo2
       
        mov byte ptr es:,0
        pop di
        pop bp
        ret
       
show_string:
        push bp                                                ;备份环境
        mov bp,sp
       
        mov dx,                                ;颜色
        mov ax,                                ;行号        行号需要计算所以保存在ax
        mov bx,
        mov es,bx                                        ;显示段地址
        mov bx,
        mov ds,bx                                        ;打印的字符串首地址
       
        sub bx,bx
        mov bl,al                                        ;偏移在多少列?
        add bl,bl                                        ;一个160个字节 1个字符需要占用2个字节
        mov di,bx
       
        mov al,ah                                        ;偏移在多少行?
        mov bx,160
        mul bl
        add di,ax

        mov ax,dx                                        ;备份颜色
        sub cx,cx
        sub si,si
show_string1:
        mov bl,ds:                                ;读取值
        mov es:,bl                                ;字符
        mov byte ptr es:.1,al        ;颜色
       
        mov cl,bl
        add di,2
        inc si
        jcxz show_string_over
        jmp show_string1
show_string_over:
        pop bp                                                ;恢复在函数使用的环境
        ret                                                 ;返回函数,4表示在调用函数时传入的参数sp+4
code ends
end start

页: [1]
查看完整版本: 实验十 3.数值显示