who can help to write program in assembly language to Adding 3 -digit numbers ? plz
It depends on what type of assembly is. You need to give the architecture or list some commands of the language
THE 80X86 MICROPROCESSOR
it still depends on what output and input you're using.
like 124+999=1123 user will enter the input in decimal
i write program can add 2- digits but when add 99+99 will give wrong results
Take total and set it equal to 0, then grab the first digit and set total = total * 10 + digit - 48 and you should have the right value.
This is in MIPS add $t6, $zero, $zero # total mul $t6, $t6, 10 # total = 10 * total add $t6, $t6, $t0 # total = total + digit sub $t6, $t6, 48 # total = total - 10
So now, there seems to be a problem when I add 2 numbers and their result will be a 3-digit number. The jump named IS_3DIGIT handles that possibility, but addition of some numbers like 80 + 80, 99 + 99, 89 + 82 all give wrong results. 56 + 77 works well. So my hypothesis is that adding two numbers higher than 79 will give wrong results. How can I resolve this problem? BTW, additions like 99 + 23 or 89 + 43 give correct results. .MODEL SMALL .STACK 1000 .DATA MSGA DB 13,10,"Input first number: ","$" MSGB DB 13,10,"Input second number:","$" MSGC DB 13,10,"The sum is: ","$" NUM1 db ? NUM2 db ? NUM3 db ? .CODE MAIN PROC NEAR MOV AX, @DATA MOV DS, AX ; get first number LEA DX, MSGA MOV AH, 09h INT 21h MOV AH, 01 INT 21H SUB AL, '0' MOV BL, AL MOV AH, 01 INT 21H SUB AL, '0' MOV CL, AL ; get second number LEA DX, MSGB MOV AH, 09h INT 21h MOV AH, 01 INT 21H SUB AL, '0' MOV DL, AL MOV AH, 01 INT 21H SUB AL, '0' MOV DH, AL ; add MOV AL, CL MOV AH, BL ADD AL, DH AAA ADD AH, DL MOV NUM1, AL ADD NUM1, '0' ; if tens digit is less than or equal to 9 CMP AH, 9 JLE NOT_3DIGIT IS_3DIGIT: MOV AL, AH ; move value of ah to al SUB AH, AH ; clear ah ADD AL, 0 ; al + 0 = al (tens digit) AAA ; move for addition ADD AH, 0 ; ah + 0 + 1 = ah + 1 (hundreds digit) MOV NUM2, AL MOV NUM3, AH ADD NUM2, '0' ADD NUM3, '0' ; output sum LEA DX, MSGC MOV AH, 09h INT 21h MOV DL, NUM3 MOV AH, 02H INT 21h MOV DL, NUM2 MOV AH, 02H INT 21h JMP PRINT_LASTDIGIT NOT_3DIGIT: MOV NUM2, AH ADD NUM2, '0' ; output sum LEA DX, MSGC MOV AH, 09h INT 21h MOV DL, NUM2 MOV AH, 02H INT 21h PRINT_LASTDIGIT: MOV DL, NUM1 MOV AH, 02H INT 21h EXIT: MOV AH, 4Ch INT 21h MAIN ENDP END MAIN
i am tired from thinking at that program
Well i give you my programme, It's works very good, but it uses the windows interruptions, so you can use it inthe emulator 8086 and not NASM, it's a whole calculator, (one other thing, i use here a french messages, so you have to modifie them): ;------------------PROGRAMME CALCUL---------------------------------- CSEG SEGMENT ASSUME CS:CSEG, SS:CSEG, DS:CSEG org 100H ;------------------Zone Macro---------------------------------------- CRLF MACRO MOV AH,02h MOV DL,0dH INT 21H MOV DL,0AH INT 21H ENDM ;------------------programme principal-------------------------------- MAIN : JMP DEB ;-------------------------------------Procédures ---------------------- ;------------------conversion ASCII en decimal--------------------------- ASC_DEC PROC MOV CL,[DI+1] ADD DI,2 MOV CH,0 ASCDEC_BOUCLE: MOV AL,[DI] AND AL, 00001111B STOSB LOOP ASCDEC_BOUCLE RET ASC_DEC ENDP ;------------------conversion decimal en Hexa---------------------------- DEC_HEX PROC MOV AX,0 MOV CL,[SI+1] MOV CH,0 MOV BX,0AH ADD SI,2 DEC_HEX_BOUCLE: MUL BX ADD AL, [SI] ADC AH, 0 INC SI LOOP DEC_HEX_BOUCLE RET DEC_HEX ENDP ;------------------conversion Hexa en decimal -------------- HEX_DEC PROC ADD DI,BX MOV AX,[SI] MOV T2,AX MOV AX,[SI+2] MOV T,AX HEX_DEC_BOUCLE: MOV DX,0 MOV BX,0Ah MOV AX,T DIV BX MOV T,AX MOV AX,T2 DIV BX MOV [DI],DL DEC DI MOV T2,AX CMP T2,0 JNE HEX_DEC_BOUCLE CMP T2,0 JNE HEX_DEC_BOUCLE RET HEX_DEC ENDP ;---------------------conversion decimal en ASCII------------------------ DEC_ASC PROC MOV CL,[DI+1] MOV CH,0 ADD DI,2 DEC_ASC_BOUCLE: MOV AL,[DI] OR AL,00110000B STOSB LOOP DEC_ASC_BOUCLE RET DEC_ASC ENDP ;------------------Fin des procédures ------------------------------------------ ;----------------Effacement de tout ce qui est à l'ecran ---------------------------- DEB: MOV AX,3 INT 10H lea dx,acceuill mov ah,09h int 21h ;---------------Affichage message nombre 1------------------------- LEA DX,MESS_NB1 MOV AH,09H INT 21H CRLF ;------------------saisie 1er nombre------------- MOV AH,0AH LEA DX, NB1 INT 21H ;CRLF ;------------------conversion 1er nombre (ASCII en Décimal en Hexadécimal) LEA DI,NB1 CALL ASC_DEC LEA SI,NB1 CALL DEC_HEX MOV NB1H, AX ;lea dx,nb1 ;mov ah,9h ;int 21h ;---------------------------lecture d'un caractere----------------------- op: MOV AH,1 int 21h mov opr,AL ;CRLF ;--------------------affichage du message nombre 2 --------- ;LEA DX,MESS_NB2 ;MOV AH,09H ;INT 21H ;CRLF ;------------------saisie 2ème nombre----------------------- MOV AH,0AH LEA DX, NB2 INT 21H ;CRLF ;------------------conversion 2ème nombre (ASCII en Décimal en Hexadécimal) LEA DI,NB2 CALL ASC_DEC LEA SI,NB2 CALL DEC_HEX MOV NB2H, AX cmp opr,'-' je soustraction cmp opr,'+' je addition cmp opr,'*' je multiplication cmp opr,'/' je division CRLF LEA DX,MESS_ERROR MOV AH,09h INT 21h jmp fff ;------------------addition addition: MOV AX,NB1h ADD AX,NB2H mov nb1h,ax cmp ax,0 jl aa bb: MOV RESADDH,AX MOV RESADDH+2,0 ;-----------------conversion de la somme (Hexadécimal en Décimal en ASCII) LEA SI,RESADDH LEA DI,RESADD MOV BX,6 CALL HEX_DEC LEA DI,RESADD CALL DEC_ASC jmp s ;lea dx,nb1 aa: not ax add ax,1 jmp bb ;----------------affichage de la somme ;CRLF s: LEA DX,MESS_ADDITION MOV AH,09h ;crlf INT 21h CRLF cmp nb1h,0 jl az continue:LEA DX,RESADD+2 MOV AH,09H INT 21H jmp op az: lea dx,tiret mov ah,09h int 21h jmp continue ;CRLF jmp op ;------------------soustraction soustraction: MOV AX,NB1H MOV BX,NB2H CMP AX,BX Jl nbneg SUB AX,BX MOV RESSOUH,AX mov cx,ax JMP fin nbneg: MOV negatif,1 SUB aX,bX mov cx,ax not ax add ax,1 MOV RESSOUH,ax fin: MOV RESSOUH+2,0 ;-----------------conversion de la différence (Hexadécimal en Décimal en ASCII) LEA SI,RESSOUH LEA DI,RESSOU MOV BX,5 CALL HEX_DEC mov nb1h,cx LEA DI,RESSOU CALL DEC_ASC ;----------------affichage de la différence ;CRLF LEA DX,MESS_SOUSTRACTION MOV AH,09h INT 21h CRLF CMP negatif,1 JNE nbpos LEA DX,SIGNE_MOINS MOV AH,09H INT 21H nbpos: LEA DX,RESSOU+2 MOV AH,09H INT 21H jmp op ;------------------multiplication multiplication: MOV AX,NB1H MOV BX,NB2H mov si,0 cmp ax,0 jg conm not ax add ax,1 mov si,1 conm: MUL BX cmp si,1 jne conm1 mov cx,ax not cx add cx,1 mov nb1h,cx conm1: cmp si,1 je conm2 mov nb1h,ax conm2: MOV RESMULH,AX MOV RESMULH+2,DX ;------------------conversion du produit (Hexadécimal en Décimal en ASCII) LEA SI,RESMULH LEA DI,RESMUL MOV BX,9 CALL HEX_DEC LEA DI,RESMUL CALL DEC_ASC ;------------------affichage du produit ;CRLF LEA DX,MESS_MULTIPLICATION MOV AH,09h INT 21h CRLF cmp nb1h,0 jge ddd lea dx,tiret mov ah,09h int 21h ddd: LEA DX,RESMUL+2 MOV AH,09H INT 21H jmp op ;------------------division division: MOV DX,0 MOV AX,NB1H MOV BX,NB2H CMP BX,0 JNE divbonne MOV divispar0,1 JMP errordiv divbonne: mov si,0 cmp ax,0 jg con not ax add ax,1 mov si,1 con: DIV BX cmp si,1 jne con1 mov cx,ax not cx add cx,1 mov nb1h,cx con1: cmp si,0 jne cond1 mov nb1h,ax cond1: MOV QUOTIENTH,AX MOV QUOTIENTH+2,0 MOV RESTEH,DX MOV RESTEH+2,0 ;------------------conversion du quotient et du reste (Hexadécimal en Décimal en ASCII) LEA SI,QUOTIENTH LEA DI,QUOTIENT MOV BX,5 CALL HEX_DEC LEA DI,QUOTIENT CALL DEC_ASC LEA SI,RESTEH LEA DI,RESTE MOV BX,5 CALL HEX_DEC LEA DI,RESTE CALL DEC_ASC errordiv: ;------------------ affichage du quotient et du reste CMP divispar0,1 JE errormsg LEA DX,MESS_DIVISION_QUOTIENT MOV AH,09h INT 21h CRLF cmp nb1h,0 jge suite1 lea dx,tiret mov ah,09h int 21h suite1: LEA DX,QUOTIENT+2 MOV AH,09H INT 21H lea dx,point int 21h ;CRLF ;CRLF ;CRLF LEA DX,RESTE+2 MOV AH,09H INT 21h JMP op errormsg: LEA DX,MESS_DIVISION_ERROR MOV AH,09h INT 21h jmp op ;------------------fin d'execution------------------------------------ fff: exit: CRLF MOV AH,4CH INT 21H ;-------------------------zone des variables-------------------------- ;-------------------------Variables de depart------------------------- NB1 DB 5,?,5 dup(-1) NB2 DB 5,?,5 dup(-1) ;----------------------Variables de travail--------------------------- negatif db 0 divispar0 db 0 T DW ? T2 DW ? ;-------------------------Variables intermediaires hexadécimales------ NB1H DW ? NB2H DW ? RESADDH DW 2 DUP (?) RESSOUH DW 2 DUP (?) RESMULH DW 2 DUP (?) QUOTIENTH DW 2 DUP (?) RESTEH DW 2 DUP (?) ;-------------------------Variables des resulats---------------------- RESADD DB 6,5,6 dup (0),"$" tiret db "-$" RESSOU DB 5,4,5 dup (0),"$" RESMUL DB 9,8,8 dup (0),"$" QUOTIENT DB 5,4,5 dup (0),"$" RESTE DB 5,4,5 dup (0),"$" opr DB ? ;------------------------Variables messages------------------------ MESS_NB1 DB 10,13,"LES ETAPES A SUIVRE:",10,13 db 10,13,"1-ECRIVER LE PREMIER NOMBRE ET APPUYER SUR ENTRER.",10,13 db 10,13,"2-FAITES ENTRER L'OPERATEUR.",10,13 db 10,13,"3-ECRIVER LE DEUXIEME NOMBRE ER REAPUYER SUR ENTRER.",10,13,"$" MESS_NB2 DB "Veuillez saisir un autre nombre (max 4 chiffres) :$" acceuill db " ---------------------------------------",10,13 db " | TP D'ASSEMBLEUR :CALCULATRICE |",10,13 db " ---------------------------------------",10,13 db 10,13," REALISER PAR:",10,13 db " -------------",10,13 db 10,13," 1-DRID AKRAM.",10,13 db 10,13," 2-DRIDI ALI AYOUB",10,13,"$" point db ".$" MESS_ADDITION DB "=$" MESS_SOUSTRACTION DB "=$" SIGNE_MOINS DB "-$" MESS_MULTIPLICATION DB "=$" MESS_DIVISION DB "=$" MESS_ERROR DB "Erreur operateur inconnu !$" MESS_DIVISION_RESTE DB "Reste de la division entiere :$" MESS_DIVISION_QUOTIENT DB "=$" MESS_DIVISION_ERROR DB "ERREUR : Pas de resultat pour la division. Division par 0 impossible$" ;----------------------------fin du programme------------------------ CSEG ENDS END MAIN
Join our real-time social learning platform and learn together with your friends!