0

我在 x86 汇编中编写了一个简单的程序,并尝试使用 TASM(Turbo) 和 TLINK 运行它。

当我输入 4 和 3 时,减法输出/而不是1,这是应该的。

但是当我输入 3 和 4 时,我得到了正确的结果。

求和和排序工作正常,代码仅用于减法不正确。

有什么帮助吗?

code Tasm

.model small
.stack
.code

DONNEES SEGMENT

    Nombre1Msg       db 'Entrez le 1er chiffre:$'
    Nombre2Msg       db 'Entrez le 2er chiffre:$'
    DifferenceMsg    db 'Leur difference:$'
    SommeMsg         db 'Leur Somme:$'
    AscMsg           db 'En Ordre croissant:$'
    DescMsg          db 'En Order decroissant:$'
    Sperateur        db ',$'
    return           db 0DH,0AH,('$')

    Nombre1          db 
    Nombre2          db
    Somme            db
    Difference       db 

DONNEES ENDS

Main PROC FAR

ASSUME DS:DONNEES
MOV AX,DONNEES 
MOV DS,AX

MOV DX,offset Nombre1Msg
MOV AH,9
INT 21H


MOV AH,1 ; saisie
INT 21H ; le caractere lu arrive dans AL
Sub AL,'0';le chiffre= code ASCII-ASCII(0)
MOV Nombre1,AL

call LineFeed

MOV DX,offset Nombre2Msg
MOV AH,9
INT 21H

MOV AH,1 ; saisie
INT 21H ; le caractere lu arrive dans AL
Sub AL,'0';le chiffre= code ASCII-ASCII(0)
MOV Nombre2,AL

CMP Nombre1,AL ; 2éme chifre en AL
JL Permutation
Permutation:
MOV AL,Nombre1
MOV AH,Nombre2
MOV Nombre1,AH
MOV Nombre2,AL


MOV AL,Nombre1
SUB AL,Nombre2
MOV Difference,AL


MOV Al,Nombre1
add AL,Nombre2
MOV Somme,AL

call LineFeed

MOV DX,offset DifferenceMsg
MOV AH,9
INT 21H

MOV DL,Difference
ADD DL,48
MOV AH,2
INT 21H


call LineFeed

MOV DX,offset SommeMsg
MOV AH,9
INT 21H

MOV DL,Somme
ADD DL,48
MOV AH,2
INT 21H

call LineFeed

MOV DX,offset AscMsg
MOV AH,9
INT 21H

MOV DL,Nombre2
ADD DL,48
MOV AH,2
INT 21H

MOV DX,offset Sperateur
MOV AH,9
INT 21H

MOV DL,Nombre1
ADD DL,48
MOV AH,2
INT 21H

call LineFeed

MOV DX,offset DescMsg
MOV AH,9
INT 21H

MOV DL,Nombre1
ADD DL,48
MOV AH,2
INT 21H

MOV DX,offset Sperateur
MOV AH,9
INT 21H

MOV DL,Nombre2
ADD DL,48
MOV AH,2
INT 21H

MOV AH,4CH 
INT 21H
Main ENDP    

    LineFeed proc near
    MOV dx,offset return
    MOV ah,9
    int 21h
    ret
    LineFeed endp

end
4

1 回答 1

0

好吧,这是一个错误。您的排序代码有一个条件跳转(jl在这种情况下),它没有任何效果,因为它只跳转到下一条指令,无论如何都会在下一条指令中执行:

CMP Nombre1,AL ; 2éme chifre en AL
JL Permutation
Permutation:
MOV AL,Nombre1
MOV AH,Nombre2
MOV Nombre1,AH
MOV Nombre2,AL

Nombre1您的变量名称Nombre2不是很具有描述性。如果您想在法语中使用变量名称,我会更改Nombre1例如。到Nombre_plus_grande(或bigger_number英语)和Nombre2例如。到Nombre_plus_grande(或smaller_number英语)。否则,当变量名没有任何意义时,很难调试代码。

带有英文变量名的固定版本(使大多数人更容易理解):

bigger_number db
smaller_number db

mov smaller_number,al ; store 2nd input into smaller_number
cmp bigger_number,al  ; 1st input in bigger_number, 2nd input in al
jae order_ready       ; if numbers are equal or if bigger_number is bigger,
                      ; there's then nothing to do.
    xchg al,bigger_number    ; exchange al (2nd input) and bigger_number
    mov smaller_number,al    ; store al (now the 1st input) into smaller_number
order_ready:

注意我还将有符号jl(如果小于则跳转)更改为无符号jae(如果高于或等于则跳转;jaejnb并且jnc是同义词)。由于这段代码不处理负数,我认为最好也与跳转保持一致。jge/ jnl(如果大于或等于则跳转/如果不是小于则跳转)也可以。您可能需要查看Intel x86 JUMP 快速参考

在此修复之后,您应该在代码的其他部分相应地替换变量名称。

mov al,bigger_number
sub al,smaller_number
mov Difference,AL

mov al,bigger_number
add al,smaller_number
mov Somme,al

如果总和超过 9,则输出垃圾。但是,对于有效输入,减法应该始终正确工作。

于 2013-01-12T23:38:43.323 回答