在8086程序集中没有将正确的值从内存加载到寄存器



我是8086汇编的新手,请原谅那些草率的代码和可能不必要的行,我是自学的。这段代码是我正在编写的另一个程序的片段,它需要用户输入数字。这些特定的行接受输入,然后产生计算机可以实际处理的数字。例如,取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

谢谢你的帮助!

我通常使用的算法"从键盘中获取数字"-实际上是"从键盘中获取文本并将其转换为数字",如您所知,是这样的:

preloop:

设置"result so far"寄存器为0。

将16位寄存器设置为10用作乘数

循环:

获取文本字符。你可以一次获取一个,就像你现在做的那样,或者一次从用户放置的输入缓冲区中加载一个。

确保你有一个十进制数字-那些讨厌的用户会输入任何该死的东西!您可能想要接受'+'和/或'-'。我会在这里注意13 (CR)或其他终止字符,而不是像您所做的那样在末尾(您并不想将"转换为数字"算法应用于CR)。对于"垃圾输入"(如果有的话),您可以为所欲为。

最简单的是假设一个行为良好的用户。我通常只返回到目前为止得到的数字——即使是零。一个礼貌的错误信息,让他们重试是最好的。

一旦你得到一个有效的十进制数字,从字符中减去'0' -注意,这是字符'0',而不是数字0..如果你喜欢,你可以称之为48或30小时,但我认为"0"更明显地说明了它的用途。

然后将"result so far"乘以10。

然后对当前数字进行相加。这可能有点小技巧。我们不能做add ax, bl。我们可以取add ax, bx,但我们必须确保bh为零!(更改寄存器以适应您的目的)

重复直到找到CR(或其他终止字符)。就这样,数字在"result so far"里。

希望这对你有帮助。你的思路是对的,但我认为你把事情弄得太复杂了。到目前为止,你自己解决了这个问题,真是太好了!

说到"号码到短信"的部分,我看到一个非常甜蜜、简单的例子,是前几天这里的一个常客发的。我的记性不好。如果你需要的话,你可能会找到它。

最新更新