《汇编语言》_王爽 第10章 call和ret指令 实验10编写子程序_3.数值显示_作业

内容分享12小时前发布
0 0 0

assume cs:code, ds:data, es:data1, ss:stack
data segment
    dw 123,12666,1,8,3,38
data ends

data1 segment
    db 32 dup(0)
data1 ends

stack segment
    dw 16 dup(0)
stack ends

code segment
_start:
    mov ax, data
    mov ds, ax
    mov ax, data1
    mov es, ax
    mov ax, stack
    mov ss, ax
    mov sp, 32

    ; 转换数字为字符串
    mov si, 0      ; data 索引
    mov di, 0      ; data1 索引
    mov cx, 6      ; 6个数字
s1:
    push cx
    mov ax, ds:[si]    ; 要转换的数字
    call word_to_dec   ; 调用转换子程序
    add si, 2
    mov byte ptr es:[di], ','  ; 添加逗号分隔符
    inc di
    pop cx
    loop s1

    ; 显示字符串
    mov si, 0
    mov dh, 8       ; 行号
    mov dl, 3       ; 列号  
    mov cl, 2       ; 颜色属性
    call show_str

    mov ax, 4c00h
    int 21h

; 子程序:将AX中的字转换为十进制字符串
; 输入:AX = 要转换的数字
; 输出:ES:DI 指向的字符串
word_to_dec proc
    push ax
    push bx
    push cx
    push dx
    push si
    
    mov bx, 10      ; 除数
    mov si, di      ; 保存起始位置
    
    ; 处理数字0的特殊情况
    cmp ax, 0
    jnz convert
    mov byte ptr es:[di], '0'
    inc di
    jmp done
    
convert:
    ; 逐位转换(使用栈反向)
    mov cx, 0       ; 数字位数计数
digit_loop:
    mov dx, 0       ; 清零DX
    div bx          ; AX = 商, DX = 余数
    push dx         ; 保存余数(数字)
    inc cx
    cmp ax, 0
    jnz digit_loop
    
    ; 从栈中弹出数字(正序)
pop_loop:
    pop ax
    add al, '0'     ; 转换为ASCII
    mov es:[di], al ; 存储字符
    inc di
    loop pop_loop

done:
    pop si
    pop dx
    pop cx
    pop bx
    pop ax
    ret
word_to_dec endp

; 子程序:显示字符串
; 输入:DH=行, DL=列, CL=颜色, ES:SI=字符串
show_str proc
    push ax
    push bx
    push cx
    push dx
    push si
    push di
    push es
    
    mov ax, 0b800h
    mov ds, ax      ; DS指向显示缓冲区
    
    ; 计算屏幕位置
    mov al, 160
    mul dh          ; AX = 行号 × 160
    mov di, ax      ; DI = 行偏移
    mov al, dl
    mov ah, 0
    add ax, ax      ; AX = 列号 × 2
    add di, ax      ; DI = 最终位置
    
    mov ah, cl      ; 颜色属性
    mov bx, si      ; 保存字符串起始
    
display_loop:
    mov al, es:[si] ; 从ES段读取字符
    cmp al, 0       ; 检查结束符
    jz show_done
    cmp al, ','     ; 逗号也显示
    jz show_char
    cmp al, '0'     ; 检查是否为数字
    jb show_done
    cmp al, '9'
    ja show_done
    
show_char:
    mov ds:[di], al ; 显示字符
    mov ds:[di+1], ah ; 显示属性
    inc si
    add di, 2
    jmp display_loop

show_done:
    pop es
    pop di
    pop si
    pop dx
    pop cx
    pop bx
    pop ax
    ret
show_str endp

code ends
end _start



assume cs:code, ds:data, es:data1, ss:stack
data segment
    dw 123,12666,1,8,3,38
data ends
 
data1 segment
    db 32 dup(0)
data1 ends
 
stack segment
    dw 16 dup(0)
stack ends
 
code segment
_start:
    mov ax, data
    mov ds, ax
    mov ax, data1
    mov es, ax
    mov ax, stack
    mov ss, ax
    mov sp, 32
 
    ; 转换数字为字符串
    mov si, 0      ; data 索引
    mov di, 0      ; data1 索引
    mov cx, 6      ; 6个数字
s1:
    push cx
    mov ax, ds:[si]    ; 要转换的数字
    call word_to_dec   ; 调用转换子程序
    add si, 2
    mov byte ptr es:[di], ','  ; 添加逗号分隔符
    inc di
    pop cx
    loop s1
 
    ; 显示字符串
    mov si, 0
    mov dh, 8       ; 行号
    mov dl, 3       ; 列号  
    mov cl, 2       ; 颜色属性
    call show_str
 
    mov ax, 4c00h
    int 21h
 
; 子程序:将AX中的字转换为十进制字符串
; 输入:AX = 要转换的数字
; 输出:ES:DI 指向的字符串
word_to_dec proc
    push ax
    push bx
    push cx
    push dx
    push si
    
    mov bx, 10      ; 除数
    mov si, di      ; 保存起始位置
    
    ; 处理数字0的特殊情况
    cmp ax, 0
    jnz convert
    mov byte ptr es:[di], '0'
    inc di
    jmp done
    
convert:
    ; 逐位转换(使用栈反向)
    mov cx, 0       ; 数字位数计数
digit_loop:
    mov dx, 0       ; 清零DX
    div bx          ; AX = 商, DX = 余数
    push dx         ; 保存余数(数字)
    inc cx
    cmp ax, 0
    jnz digit_loop
    
    ; 从栈中弹出数字(正序)
pop_loop:
    pop ax
    add al, '0'     ; 转换为ASCII
    mov es:[di], al ; 存储字符
    inc di
    loop pop_loop
 
done:
    pop si
    pop dx
    pop cx
    pop bx
    pop ax
    ret
word_to_dec endp
 
; 子程序:显示字符串
; 输入:DH=行, DL=列, CL=颜色, ES:SI=字符串
show_str proc
    push ax
    push bx
    push cx
    push dx
    push si
    push di
    push es
    
    mov ax, 0b800h
    mov ds, ax      ; DS指向显示缓冲区
    
    ; 计算屏幕位置
    mov al, 160
    mul dh          ; AX = 行号 × 160
    mov di, ax      ; DI = 行偏移
    mov al, dl
    mov ah, 0
    add ax, ax      ; AX = 列号 × 2
    add di, ax      ; DI = 最终位置
    
    mov ah, cl      ; 颜色属性
    mov bx, si      ; 保存字符串起始
    
display_loop:
    mov al, es:[si] ; 从ES段读取字符
    cmp al, 0       ; 检查结束符
    jz show_done
    cmp al, ','     ; 逗号也显示
    jz show_char
    cmp al, '0'     ; 检查是否为数字
    jb show_done
    cmp al, '9'
    ja show_done
    
show_char:
    mov ds:[di], al ; 显示字符
    mov ds:[di+1], ah ; 显示属性
    inc si
    add di, 2
    jmp display_loop
 
show_done:
    pop es
    pop di
    pop si
    pop dx
    pop cx
    pop bx
    pop ax
    ret
show_str endp
 
code ends
end _start

© 版权声明

相关文章

暂无评论

none
暂无评论...