Assembly 在TASM x86程序集中减去2个数字
我用x86汇编编写了一个简单的程序,并尝试使用TASM(Turbo)和TLINK运行它 当我输入4和3时,减法输出的是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
/
,而不是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