答案在最后面
有两个答案,建议直接看第二个
assume cs:code
data segment
db 10 dup(0)
data ends
code segment
start:mov ax,1266
mov bx,data
mov ds,bx
mov si,0
call dtoc
mov dh,8
mov dl,3
mov cl,2
call show_str
MOV AX,4C00H
INT 21H
dtoc:
PUSH AX
PUSH BX
PUSH CX
PUSH SI
PUSH DX
MOV DX,0
s:
mov dx,0
MOV BX,10
div BX ;ax/bx ,商存在ax中,余数存在dx中
add dX,30H ;由题意得要+30H
mov [si],dX ;把该值存到内存data segment
mov cx,ax
jcxz k ;用cx判断是否跳出此循环
inc si ;循环加一
inc cx ;该步骤非常具有启发性
;因为loop需要让cx-1,所以如果cx此时是1的时候
;它就会直接返回了,而不是继续执行多一次循环
;注意,我们在这个步骤需要的是从jcxz处跳出循环
loop s
k:
POP DX
POP SI
POP CX
POP BX
POP AX
ret
SHOW_STR:
PUSH DX
PUSH CX
PUSH DS
PUSH SI
MOV AX,0B800H
MOV ES,AX ;0B800H是用于控制向屏幕输出的一段内存
;一共25*80*2个字
MOV AL,160 ;每行160个字
MUL DH
MOV BX,AX
MOV AL,2 ;每个单元2个字
MUL DL
ADD BX,AX
MOV AL,CL
SKIR:
MOV CX,[SI]
JCXZ OK
MOV DX,[SI]
MOV ES:[BX],DX ;第一个字放内容
MOV ES:[BX+1],AL ;第二个字放颜色属性
INC SI
ADD BX,2
LOOP SKIR
OK:
POP SI
POP DS
POP CX
POP DX
RET
code ends
end start
写到此处,可以将数字逆序输出,如果需要正序输出,再写一个子程序即可
——————————分割线————————————
补充
一个更好的做法
assume cs:code
data segment
db 10 dup(0)
data ends
code segment
start:mov ax,1266
mov bx,data
mov ds,bx
mov si,0
call dtoc
mov dh,8
mov dl,3
mov cl,2
call show_str
MOV AX,4C00H
INT 21H
dtoc: ;数值显示的子程序定义
push dx
push cx
push ax
push si
push bx
mov bx,0
s1: mov cx,10d
mov dx,0
div cx
mov cx,ax
jcxz s2
add dx,30h
push dx ;先存入栈,为的是最后正序输出
inc bx
jmp short s1 ;使用jmp就不会存在loop减一的问题
s2: add dx,30h
push dx
inc bx ;再进行一次栈操作(补充当"商为零而余数不为零"时的情况)
mov cx,bx ;此时cx中就保存了ds:00中的非零数字个数
mov si,0
s3: pop ax
mov [si],al ;从栈中取出来,这时就成为正序了
inc si
loop s3
okay: pop bx
pop si
pop ax
pop cx
pop dx
ret ;数值显示的子程序定义结束
SHOW_STR:
PUSH DX
PUSH CX
PUSH DS
PUSH SI
MOV AX,0B800H
MOV ES,AX ;0B800H是用于控制向屏幕输出的一段内存
;一共25*80*2个字
MOV AL,160 ;每行160个字
MUL DH
MOV BX,AX
MOV AL,2 ;每个单元2个字
MUL DL
ADD BX,AX
MOV AL,CL
SKIR:
MOV CX,[SI]
JCXZ OK
MOV DX,[SI]
MOV ES:[BX],DX ;第一个字放内容
MOV ES:[BX+1],AL ;第二个字放颜色属性
INC SI
ADD BX,2
LOOP SKIR
OK:
POP SI
POP DS
POP CX
POP DX
RET
code ends
end start