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

さて、ここで 1 つのバグがあります。ソートコードには条件付きジャンプ(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英語で)およびNombre2eg。へ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(上または等しい場合はジャンプ;jaeと同義)jnbに変更したことに注意してください。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 に答える