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


