【发布时间】:2018-10-14 12:12:43
【问题描述】:
所以,我必须将数字从以 10 为底的 2 转换,我不知道该怎么做。这就是我的程序现在的样子,但我不确定到目前为止我得到的是否能正常工作.转换部分真的让我很难过,但我的代码肯定有很多错误,所以任何帮助都将不胜感激。
assume cs:code, ds:data
data segment
msg db 'Give numbers:$'
numbers LABEL BYTE
max_size DB 100
numbers_len DB ?
number DB 100 dup (?)
ten db 10
errm db 'Numbers not in binary.$'
data ends
code segment
start:
mov ax,data
mov ds,ax
mov ah,09h
mov dx,offset msg
int 21h
mov AH,0Ah
mov DX,offset numbers
int 21h
mov CL,numbers_len
mov CH,0
mov SI,0
repeat:
mov AL,number[SI]
cmp AL,' '
je conversion
check:
cmp AL,'0'
jb erro
cmp AL,'1'
ja erro
jmp conversion
continue:
inc SI
dec cx
jcxz print
jmp repeat
conversion:
jmp continue
print:
pop dx
add dl,'0'
mov ah,02h
int 21h
loop print
erro:
mov ah,09h
mov dx,offset errm
int 21h
mov ax,4c00h
int 21h
code ends
end start
【问题讨论】:
-
好的,您遇到了什么问题?您已经大致说明了所需的行为和输出,但您没有提及提供的输入,也没有提及观察到的输出。拜托,拜托 - 不要说“它不工作”。您是否使用调试器单步执行了代码?具体来说,您需要哪些帮助?
-
输入数字后进入无限循环
-
TurboDebugger 一直是 DOS 的好调试器。不管怎样,看看
check:标签后面的代码。如果数字太小,切掉。如果数字太大,请切掉。如果数字正好(0 或 1),则 jmp 到conversion。此时,如果您从未跳转到conversion.嗯嗯?!您的其他问题之一是认为您的循环计数器CX在int 21h期间未被触及 - 它不是,您应该先推它然后再弹出它。接下来,您将循环弹出dx。先推送这么多次了吗? -
@enhzflep 我看到 int 21h/02h 21h/09h 和 21h/0ah。哪一个会破坏 CX、CL 或 CH?据我所知,这些特殊的中断不会破坏 CX。
-
@MichaelPetch - 确实如此。进一步检查发现我记错了。 :用ECC垂头寻找神经元: