我是8086大会的新手,请原谅邋code的代码和可能不必要的线条,我是自学成才。这段代码是我正在制作的另一个程序的片段,需要用户输入数字。这些特定的行接受输入,然后产生计算机实际可以使用的数字。例如,取5,4和3并将数字“编译”为543.
问题出现在第59行,我尝试从内存加载一个数字来注册bx,在这种情况下,不是加载正确的数字,如40(来自543 ex。)它只加载1 。
第59行之后的某些代码甚至可能无法正常工作,因为我被困在那里。
我可能没有使用正确的寄存器,但同样,我自学并且很容易理解有关在线语法的信息。
org 100h
mov si, 100d
input1:
mov ah, 1h ;input char
int 21h
push ax
sub al, 30h ;convert ascii to integer
mov dl, al ;put char into dl to be read
mov [si], al ;save char to ram for later
mov ah, 2h ;output char
inc si ;to save on next location in mem
pop ax
cmp al, 13 ;check if done
jne input1
dec si ;insert terination char
dec si ;decrement to save value of si for multilying by ten
push si ;save current si value
inc si ;then continue
mov al, 24h
mov [si], al
pop si
mov cx, 1
compileNum1:
mov ax, 0
mov bx, 0
mov dx, 0
.fixNum:
mov al, [si] ; load last num into ax to be multiplied by 10
mul cx
mov bp, ax
mov [si], bp
dec si
mov al, 10
mov bx, cx
mul bl
mov cx, ax
cmp si, 99d
jne .fixNum
mov si, 100d ;starts number addition
mov ax, [si] ;loads first number
inc si ;prepares second
mov bx, [si] ;loads second
cmp bx, 24h ;checks if there was only 1 number
je .terminate1 ;if there was, goto terminate
add ax, bx ;else add them together
.stloop1:
inc si ;prepares for third, fourth etc
mov bx, [si] ;loads it
cmp bx, 24h ;checks if numbver is 3 digts ot more long (depends on loop)
je .terminate1 ;terminate if so
add ax, bx ;add them together, store in ax
.terminate1:
mov [100d], ax
mov ax, 0 ;clear screen
int 10h
mov ah, 2h ;print char
int 21h
mov ah, 0
int 16h
ret
感谢您的帮助!
答案 0 :(得分:0)
我通常用来“从键盘上获取一个数字”的算法 - 实际上是“从键盘获取文本并将其转换为数字”,如下所示:
preloop:
将“到目前为止的结果”寄存器设置为零。
将16位寄存器设置为10以用作乘法器
循环:
获取文字字符。您可以像往常一样获取一个,或者从用户放置的输入缓冲区一次加载一个。
确保你有一个十进制数字 - 那些讨厌的用户会输入任何令人讨厌的东西!您可能希望接受“+”和/或“ - ”。我在这里注意13(CR)或其他终止字符,而不是在你正在做的最后(你真的不想将“转换为数字”算法应用于CR)。你可以做你想要的“垃圾输入”,如果有的话。
最简单的事情是假设一个表现良好的用户。我通常只返回我到目前为止的数字 - 即使为零。一个礼貌的错误消息,让我们重试是最好的。
一旦你得到一个有效的十进制数字,从字符中减去'0'
- 注意这是字符'0',而不是数字0 ..如果你愿意,可以叫它48或30h,但我认为“0”更明显“它是什么”。
然后将“到目前为止的结果”乘以10。
然后添加从当前数字获得的数字。这可能有点三分钱。我们不能add ax, bl
。我们可以add ax, bx
,但我们必须确保bh
为零! (更改寄存器以满足您的目的)
重复直到我们找到CR(或其他终止字符)。就是这样,这个数字是“到目前为止的结果”。
希望这会有所帮助。我认为你正走在正确的轨道上,但它使它变得比它需要的更复杂。到目前为止,您可以自己搞清楚!
谈到“数字到文字”部分,我看到其中一位常客在这里发布了一个非常甜蜜,简单的例子。我的记忆很糟糕。 如果需要,你可以找到它。