我实际上是使用emu8086进行汇编代码的初学者。我想对两个数字进行求和,每个数字两个字符,然后为 n 个字符生成它。我能够用一个角色做到这一点,但不能用两个角色做到这一点。
data segment
mess1 db "saisir le premier nombre : $"
mess2 db 0Ah,0Dh, "saisir le second nombre : $" ;0ah, 0dh pour faire le saut de ligne
mess3 db 0Ah,0Dh, "le resultat est : $"
a db ? ; contient le nombre apres conversion
b db ?
res db ?
buffer db 2 dup ('$')
dix db 10
data ends
code segment
assume cs:code, ds: data
debut:
mov ax,data
mov ds,ax
;affichage du 1er message
mov DX, offset mess1 ; lea DX,mess1
call AffichageMess
;saisie du premier nombre
call SaisiNb
;convertion du premier nombre
call ConvertNb
mov a,al
;affichage du 2eme message
mov DX, offset mess2 ; lea DX,mess2
call AffichageMess
;saisie du deuxieme nombre
call SaisiNb
;convertion du deuxieme nombre
call ConvertNb
mov b,al
call Somme
mov DX, offset mess3 ;lea DX,mess3
call AffichageMesRes
fin: mov ah,4ch
int 21h
;DECLARATION DES PROC
affichageMess Proc
mov ah,09h
int 21h
Ret
affichageMess endp
SaisiNb Proc
xor si,si
xor cx,cx
mov cx,2 ;saisie de chaine numerique de 2caracteres
Repeat:
mov ah,01h
int 21h
mov buffer[si],al ;Mode d'adressage INDEXE RELATIF
inc si
loop Repeat
Ret
SaisiNb endp
ConvertNb Proc
xor ax,ax
mov al,buffer[0]
sub al,'0'
mul dix
mov bl,buffer[1]
sub bl,'0'
add al,bl
Ret
ConvertNb endp
Somme Proc
mov al,a
add al,b
mov res,al
Ret
Somme endp
AffichageMesRes Proc
mov ah,09h
int 21h
call Somme
mov ah,02h
int 21h
Ret
AffichageMesRes endp
code ends
end debut
答案 0 :(得分:2)
您的AffichageMesRes
过程错误。首先,尽管两个数字都已添加到主线程Somme
中,但它再次调用debut:
。
其次,使用DOS函数AH = 2将字符写入标准输出要求将字符加载到DL中,而不是在DL中加载。
res
中的计算结果是一个8位无符号二进制数。例如,如果您输入 12 作为 le Premier nombre ,并且 34 作为 le Second nombre ,则结果为12+ 34 = 46,它以0x2E的形式存储在res
中。您需要先将二进制0x2E转换为两个十进制字符“ 4”和“ 6”,然后才能在控制台上写入它们。
提示:将0x2E除以 dix ,并将分号(4)用作第一位数字,其余数(6)用作第二位数字。