Assembly 在TASM x86程序集中减去2个数字

Assembly 在TASM x86程序集中减去2个数字,assembly,x86,tasm,Assembly,X86,Tasm,我用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 'E

我用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

嗯,这里有一个bug。您的排序代码有一个条件跳转(
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
例如改为
nombreu plus_grande
(或
bigger_number
英语)和
Nombre2
例如改为
nombreu plus_grande
(或
minger_number
)。否则,当变量名没有任何意义时,就很难调试代码

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

注:我还将带符号的
jl
(如果小于则跳转)更改为无符号的
jae
(如果大于或等于,则跳转;
jae
jnb
jnc
是同义词)。由于这段代码不处理负数,我认为最好也与跳转保持一致
jge
/
jnl
(如果大于或等于跳转/如果不小于跳转)也可以工作。您可能需要检查一下

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

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

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

如果总和超过9,则输出垃圾。然而,对于有效的输入,减法应该总是正确的。

如果你减去3-4-1.或0FFh。。。添加“0”。。。2Fh,用于“/”的ascii码。。。只是说。。。
mov al,bigger_number
sub al,smaller_number
mov Difference,AL

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