我在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
答案 0 :(得分: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
(如果超过或等于,则跳转; jae
,jnb
和jnc
为同义)。由于此代码不处理负数,我认为最好与跳转一致。 jge
/ jnl
(如果大于或等于/跳跃,如果不是更少)也会起作用。您可以查看Intel x86 JUMP quick reference。
在此修复之后,您应该在代码的其他部分相应地替换变量名称。
mov al,bigger_number
sub al,smaller_number
mov Difference,AL
mov al,bigger_number
add al,smaller_number
mov Somme,al
如果总和超过9,则输出垃圾。但是,减法应始终正确地用于有效输入。