📄 task_3.asm
字号:
;Task_3.asm 习题3_3 第3题
;3. 以十进制形式在计算机屏幕上显示内存中的一个16位有符号数
;例如:若内存单元中存放的数据为0100H,则在屏幕上显示+256,若内存单元存放的数据为FFFFH,则应在屏幕上显示-1
data segment para
str1 db 0dh, 0ah, 'The result is: ', '$'
num dw 8000H ;对应的十进制数为-32768
buf db 6 dup('0') ;存放输出的10进制数各位的ASCII
data ends
ss_seg segment stack
dw 50 dup(0)
ss_seg ends
code segment
assume cs:code,ds:data,ss:ss_seg
main proc far
mov ax, data
mov ds, ax
test num, 8000h ;判断是正数还是负数
jz NUM_P
mov buf, '-'
neg num ;得到负数的相反数, 后面均按无符号数处理
jmp main1
NUM_P: mov buf, '+'
main1: mov di, num
lea bx, buf+5
mov cx, 5
mov si, 10
main3: xor dx, dx
mov ax, di
and ax, ax
jz main2
div si
mov di, ax
call bin2asc
mov [bx], dl
dec bx
loop main3
main2: call disp
;int 3
mov ax, 4c00h
int 21h
main endp
;输入参数:DL中存放要转换的二进制数
;输出参数:DL中存放转换后得到的ASCII值
;功能:将二进制数转换为ASCII
bin2asc proc
add dl, 30h
cmp dl, 39h
jbe bin2asc_1
add dl, 7
bin2asc_1:
ret
bin2asc endp
;输入参数:无
;输出参数:无
;功能:将二进制数转换为ASCII
disp proc
mov dx, offset str1 ;显示输出提示
mov ah, 9
int 21h
mov dl, buf ;显示符号位
mov ah, 2
int 21h
mov cx, 4
mov bx, 1
mov si, 0
disp_1:
mov dl, buf[bx]
and si, si
jnz disp_2
cmp dl, '0'
jz disp_3
or si, 1 ;si为标志位, 0: 表明10进制数高位是0,显示时需要忽略, 1: 表明已经显示了一个非0的数字
disp_2:
push bx ;防止调用int 21h时破坏bx, cx值
push cx
mov ah, 2
int 21h
pop cx
pop bx
disp_3:
inc bx
loop disp_1
mov dl, buf+5 ;最后一个数字必须显示
mov ah, 2
int 21h
ret
disp endp
code ends
end main
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -