Author Topic: Help with my Calculator (Division) - Linux x86  (Read 8313 times)

Offline nicoobe

  • Jr. Member
  • *
  • Posts: 3
Help with my Calculator (Division) - Linux x86
« on: February 24, 2012, 01:48:46 PM »
Hello,
My name is Nicholas and I am making a calculator in assembly language to be executed on an x86 processor.

Basically, my calculator asks the user to enter two numbers and then to indicate which operation (addition, subtraction, multiplication and division) want to do with them.

My calculator adds, subtracts and multiplies correctly but is unable to divide. In making a division, I always get 1 as the result.

Then I leave my application code complete:

Code: [Select]
section .data

; Messages

msg1 db 10,'-Calculator-',10,0
lmsg1 equ $ - msg1

msg2 db 10,'Number 1: ',0
lmsg2 equ $ - msg2

msg3 db 'Number 2: ',0
lmsg3 equ $ - msg3

msg4 db 10,'1. Add',10,0
lmsg4 equ $ - msg4

msg5 db '2. Subtract',10,0
lmsg5 equ $ - msg5

msg6 db '3. Multiply',10,0
lmsg6 equ $ - msg6

msg7 db '4. Divide',10,0
lmsg7 equ $ - msg7

msg8 db 'Operation: ',0
lmsg8 equ $ - msg8

msg9 db 10,'Result: ',0
lmsg9 equ $ - msg9

msg10 db 10,'Invalid Option',10,0
lmsg10 equ $ - msg10

nlinea db 10,10,0
lnlinea equ $ - nlinea

section .bss

; Spaces reserved for storing the values ??provided by the user.

opc resb 2
num1 resb 2
num2 resb 2
result resb 2

section .text

global _start

_start:

; Print on screen the message 1
mov eax, 4
mov ebx, 1
mov ecx, msg1
mov edx, lmsg1
int 80h

; Print on screen the message 2
mov eax, 4
mov ebx, 1
mov ecx, msg2
mov edx, lmsg2
int 80h

; We get num1 value.
mov eax, 3
mov ebx, 0
mov ecx, num1
mov edx, 2
int 80h

; Print on screen the message 3
mov eax, 4
mov ebx, 1
mov ecx, msg3
mov edx, lmsg3
int 80h

; We get num2 value.
mov eax, 3
mov ebx, 0
mov ecx, num2
mov edx, 2
int 80h

; Print on screen the message 4
mov eax, 4
mov ebx, 1
mov ecx, msg4
mov edx, lmsg4
int 80h

; Print on screen the message 5
mov eax, 4
mov ebx, 1
mov ecx, msg5
mov edx, lmsg5
int 80h

; Print on screen the message 6
mov eax, 4
mov ebx, 1
mov ecx, msg6
mov edx, lmsg6
int 80h

; Print on screen the message 7
mov eax, 4
mov ebx, 1
mov ecx, msg7
mov edx, lmsg7
int 80h

; Print on screen the message 8
mov eax, 4
mov ebx, 1
mov ecx, msg8
mov edx, lmsg8
int 80h

; We get the option selected.
mov ebx,0
mov ecx,opc
mov edx,2
mov eax,3
int 80h

mov ah, [opc] ; Move the selected option to the registry ah
sub ah, '0' ; Convert from ascii to decimal

; We compare the value entered by the user to know what operation to perform.

cmp ah, 1
je add
cmp ah, 2
je subtract
cmp ah, 3
je multiply
cmp ah, 4
je divide

; If the value entered by the user does not meet any of the above
; conditions then we show an error message and we close the program.
mov eax, 4
mov ebx, 1
mov ecx, msg10
mov edx, lmsg10
int 80h

jmp exit

add:
; We keep the numbers in the registers eax and ebx
mov eax, [num1]
mov ebx, [num2]

; Convert from ascii to decimal
sub eax, '0'
sub ebx, '0'

; Add
add eax, ebx

; Conversion from decimal to ascii
add eax, '0'

; We move the result
mov [result], eax

; Print on screen the message 9
mov eax, 4
mov ebx, 1
mov ecx, msg9
mov edx, lmsg9
int 80h

; Print on screen the result
mov eax, 4
mov ebx, 1
mov ecx, result
mov edx, 1
int 80h

; We end the program
jmp exit

subtract:
; We keep the numbers in the registers eax and ebx
mov eax, [num1]
mov ebx, [num2]

; Convert from ascii to decimal
sub eax, '0'
sub ebx, '0'

; Subtract
sub eax, ebx

; Conversion from decimal to ascii
add eax, '0'

; We move the result
mov [result], eax

; Print on screen the message 9
mov eax, 4
mov ebx, 1
mov ecx, msg9
mov edx, lmsg9
int 80h

; Print on screen the result
mov eax, 4
mov ebx, 1
mov ecx, result
mov edx, 1
int 80h

; We end the program
jmp exit

multiply:

; We store the numbers in registers ax and bx
mov ax, [num1]
mov bx, [num2]

; Convert from ascii to decimal
sub ax, '0'
sub bx, '0'

; Multiply. AL = AX x BX
mul bx

; Conversion from decimal to ascii
add al, '0'

; We move the result
mov [result], al

; Print on screen the message 9
mov eax, 4
mov ebx, 1
mov ecx, msg9
mov edx, lmsg9
int 80h

; Print on screen the result
mov eax, 4
mov ebx, 1
mov ecx, result
mov edx, 1
int 80h

; We end the program
jmp exit

divide:
; IN THIS LABEL IS THE ERROR!

; We store the numbers in registers ax and bx
mov dx, 0
mov ax, [num1]
mov bx, [num2]

; Convert from ascii to decimall
sub ax, '0'
sub bx, '0'
; Division. AX = DX:AX / BX
div bx

; Conversion from decimal to ascii
add ax, '0'
; We move the result
mov [result], ax

; Print on screen the message 9
mov eax, 4
mov ebx, 1
mov ecx, msg9
mov edx, lmsg9
int 80h

; Print on screen the result
; ALWAYS PRINTS 1
mov eax, 4
mov ebx, 1
mov ecx, result
mov edx, 1
int 80h

; We end the program
jmp exit

exit:
; Print on screen two new lines
mov eax, 4
mov ebx, 1
mov ecx, nlinea
mov edx, lnlinea
int 80h
; End the program
mov eax, 1
mov ebx, 0
int 80h

The error must be found inside the tag "divide".

I hope that someone on the forum with more experience can help me with this.  :)
Thanks you

Offline Frank Kotler

  • NASM Developer
  • Hero Member
  • *****
  • Posts: 2667
  • Country: us
Re: Help with my Calculator (Division) - Linux x86
« Reply #1 on: February 24, 2012, 07:35:36 PM »
Hi Nicholas,

I hate to tell you this, but you've got more problems than you realize. Yeah, add/sub/mul "work", but only for single digits - the result has to be a single digit, too, and positive in the case of "sub". They mostly work "by luck", and at "div" your luck runs out! :)

Here's what's happening, approximately... When you get a number (either of them), assuming that the pesky user enters only one digit and hits "enter", the buffer (num1 or num2) gets the character AND the linefeed (0xA)... I tried "8" and "4", so we've got 0xA38 and 0xA34. We convert from ascii to number by subtracting '0', so we've got 0xA08 and 0xA04. In the case of add/sub/mul, the "junk" pretty much stays up out of the way, and the single digit we display is more-or-less correct. In the case of "div"... the result is 1, just what you're seeing! (plus a remainder, which we're ignoring).

I don't know the "best" way to try to fix it. Getting just one byte from the buffer would be "easy" - use al and bl instead of eax/ebx (as you're doing in add and sub) or ax/bx (as you're doing in mul and div). (I don't know why you switched to 16-bit registers for mul and div... doesn't hurt, but there's no advantage to it). This still leaves the problem of only handling a single digit, in both the inputs and result... and only a positive result for "sub". A "better" solution might be to provide subroutines that convert multi-digit numbers from ascii to number and number to ascii - and if you want to handle possible negative results from "sub", handle "signed" numbers instead of "unsigned" (slightly easier), at least on the "result" end.

What's the "specification" for this program? (the "assignment" if it's homework, or whatever you want if it's not - I assume there's no "customer" to please) What range of numbers is it "supposed" to handle? What do you want to do if the pesky user enters a non-digit? What about "overflow"? Do you want to show "remainder" in the case of "div"?

You're off to a good start - you've got the general idea right. But this needs more work - how much more is up to you! Give it another shot (figure out the "specification" first!) and get back to us if you still have trouble.

Best,
Frank


Offline nicoobe

  • Jr. Member
  • *
  • Posts: 3
Re: Help with my Calculator (Division) - Linux x86
« Reply #2 on: February 24, 2012, 10:51:43 PM »
Hello Frank,

Thank you very much. Your advices where very usefull. I read all your corrections and modify my code, but division still not works. I get a "Floating number exception".

This is the actual code with your corrections:

Code: [Select]
section .data

; Messages

msg1 db 10,'-Calculator-',10,0
lmsg1 equ $ - msg1

msg2 db 10,'Number 1: ',0
lmsg2 equ $ - msg2

msg3 db 'Number 2: ',0
lmsg3 equ $ - msg3

msg4 db 10,'1. Add',10,0
lmsg4 equ $ - msg4

msg5 db '2. Subtract',10,0
lmsg5 equ $ - msg5

msg6 db '3. Multiply',10,0
lmsg6 equ $ - msg6

msg7 db '4. Divide',10,0
lmsg7 equ $ - msg7

msg8 db 'Operation: ',0
lmsg8 equ $ - msg8

msg9 db 10,'Result: ',0
lmsg9 equ $ - msg9

msg10 db 10,'Invalid Option',10,0
lmsg10 equ $ - msg10

nlinea db 10,10,0
lnlinea equ $ - nlinea

section .bss

; Spaces reserved for storing the values ??provided by the user.

opc: resb 2
num1: resb 2
num2: resb 2
result: resb 2

section .text

global _start

_start:

; Print on screen the message 1
mov eax, 4
mov ebx, 1
mov ecx, msg1
mov edx, lmsg1
int 80h

; Print on screen the message 2
mov eax, 4
mov ebx, 1
mov ecx, msg2
mov edx, lmsg2
int 80h

; We get num1 value.
mov eax, 3
mov ebx, 0
mov ecx, num1
mov edx, 2
int 80h

; Print on screen the message 3
mov eax, 4
mov ebx, 1
mov ecx, msg3
mov edx, lmsg3
int 80h

; We get num2 value.
mov eax, 3
mov ebx, 0
mov ecx, num2
mov edx, 2
int 80h

; Print on screen the message 4
mov eax, 4
mov ebx, 1
mov ecx, msg4
mov edx, lmsg4
int 80h

; Print on screen the message 5
mov eax, 4
mov ebx, 1
mov ecx, msg5
mov edx, lmsg5
int 80h

; Print on screen the message 6
mov eax, 4
mov ebx, 1
mov ecx, msg6
mov edx, lmsg6
int 80h

; Print on screen the message 7
mov eax, 4
mov ebx, 1
mov ecx, msg7
mov edx, lmsg7
int 80h

; Print on screen the message 8
mov eax, 4
mov ebx, 1
mov ecx, msg8
mov edx, lmsg8
int 80h

; We get the option selected.
mov ebx,0
mov ecx,opc
mov edx,2
mov eax,3
int 80h

mov ah, [opc] ; Move the selected option to the registry ah
sub ah, '0' ; Convert from ascii to decimal

; We compare the value entered by the user to know what operation to perform.

cmp ah, 1
je add
cmp ah, 2
je subtract
cmp ah, 3
je multiply
cmp ah, 4
je divide

; If the value entered by the user does not meet any of the above
; conditions then we show an error message and we close the program.
mov eax, 4
mov ebx, 1
mov ecx, msg10
mov edx, lmsg10
int 80h

jmp exit

add:
; We keep the numbers in the registers eax and ebx
mov al, [num1]
mov bl, [num2]

; Convert from ascii to decimal
sub al, '0'
sub bl, '0'

; Add
add al, bl

; Conversion from decimal to ascii
add al, '0'

; We move the result
mov [result], al

; Print on screen the message 9
mov eax, 4
mov ebx, 1
mov ecx, msg9
mov edx, lmsg9
int 80h

; Print on screen the result
mov eax, 4
mov ebx, 1
mov ecx, result
mov edx, 2
int 80h

; We end the program
jmp exit

subtract:
; We keep the numbers in the registers eax and ebx
mov al, [num1]
mov bl, [num2]

; Convert from ascii to decimal
sub eax, '0'
sub ebx, '0'

; Subtract
sub al, bl

; Conversion from decimal to ascii
add al, '0'

; We move the result
mov [result], al

; Print on screen the message 9
mov eax, 4
mov ebx, 1
mov ecx, msg9
mov edx, lmsg9
int 80h

; Print on screen the result
mov eax, 4
mov ebx, 1
mov ecx, result
mov edx, 1
int 80h

; We end the program
jmp exit

multiply:

; We store the numbers in registers ax and bx
mov al, [num1]
mov bl, [num2]

; Convert from ascii to decimal
sub al, '0'
sub bl, '0'

; Multiply. AL = AX x BX
mul bl

; Conversion from decimal to ascii
add ax, '0'

; We move the result
mov [result], ax

; Print on screen the message 9
mov eax, 4
mov ebx, 1
mov ecx, msg9
mov edx, lmsg9
int 80h

; Print on screen the result
mov eax, 4
mov ebx, 1
mov ecx, result
mov edx, 1
int 80h

; We end the program
jmp exit

divide:
; IN THIS LABEL IS THE ERROR!

; We store the numbers in registers ax and bx
mov al, [num1]
mov bl, [num2]

; Convert from ascii to decimall
sub al, '0'
sub bl, '0'
; Division. AL = DX:AX / BX
div bl

; Conversion from decimal to ascii
add ax, '0'
; We move the result
mov [result], ax

; Print on screen the message 9
mov eax, 4
mov ebx, 1
mov ecx, msg9
mov edx, lmsg9
int 80h

; Print on screen the result
; ALWAYS PRINTS 1
mov eax, 4
mov ebx, 1
mov ecx, result
mov edx, 1
int 80h

; We end the program
jmp exit

exit:
; Print on screen two new lines
mov eax, 4
mov ebx, 1
mov ecx, nlinea
mov edx, lnlinea
int 80h
; End the program
mov eax, 1
mov ebx, 0
int 80h

I hope you can help me solve this and again thank you.

Offline Frank Kotler

  • NASM Developer
  • Hero Member
  • *****
  • Posts: 2667
  • Country: us
Re: Help with my Calculator (Division) - Linux x86
« Reply #3 on: February 24, 2012, 11:44:52 PM »
Code: [Select]
...
; Convert from ascii to decimall
sub al, '0'
sub bl, '0'
; Division. AL = DX:AX / BX
div bl
...

The comment is correct, but no longer matches the code. The right comment would be "al=ax/bl". For the same reason you need to zero dx before a 16=bit divide, you need to zero ah here. (not necessarily zero, but the "high part" of the number - in this case zero). I haven't tried this, but I'm pretty sure that's it.

Best,
Frank


Offline nicoobe

  • Jr. Member
  • *
  • Posts: 3
Re: Help with my Calculator (Division) - Linux x86
« Reply #4 on: February 25, 2012, 12:53:07 AM »
IT WORKS!

Thank you very much for the help. Now my one digit calculator works perfect. Haha. I'll keep reading and learning assembly language.

Below I leave my final code corrected and running, hopefully I can help any beginner to start in this language.

Code: [Select]
section .data

; Messages

msg1 db 10,'-Calculator-',10,0
lmsg1 equ $ - msg1

msg2 db 10,'Number 1: ',0
lmsg2 equ $ - msg2

msg3 db 'Number 2: ',0
lmsg3 equ $ - msg3

msg4 db 10,'1. Add',10,0
lmsg4 equ $ - msg4

msg5 db '2. Subtract',10,0
lmsg5 equ $ - msg5

msg6 db '3. Multiply',10,0
lmsg6 equ $ - msg6

msg7 db '4. Divide',10,0
lmsg7 equ $ - msg7

msg8 db 'Operation: ',0
lmsg8 equ $ - msg8

msg9 db 10,'Result: ',0
lmsg9 equ $ - msg9

msg10 db 10,'Invalid Option',10,0
lmsg10 equ $ - msg10

nlinea db 10,10,0
lnlinea equ $ - nlinea

section .bss

; Spaces reserved for storing the values ??provided by the user.

opc: resb 2
num1: resb 2
num2: resb 2
result: resb 2

section .text

global _start

_start:

; Print on screen the message 1
mov eax, 4
mov ebx, 1
mov ecx, msg1
mov edx, lmsg1
int 80h

; Print on screen the message 2
mov eax, 4
mov ebx, 1
mov ecx, msg2
mov edx, lmsg2
int 80h

; We get num1 value.
mov eax, 3
mov ebx, 0
mov ecx, num1
mov edx, 2
int 80h

; Print on screen the message 3
mov eax, 4
mov ebx, 1
mov ecx, msg3
mov edx, lmsg3
int 80h

; We get num2 value.
mov eax, 3
mov ebx, 0
mov ecx, num2
mov edx, 2
int 80h

; Print on screen the message 4
mov eax, 4
mov ebx, 1
mov ecx, msg4
mov edx, lmsg4
int 80h

; Print on screen the message 5
mov eax, 4
mov ebx, 1
mov ecx, msg5
mov edx, lmsg5
int 80h

; Print on screen the message 6
mov eax, 4
mov ebx, 1
mov ecx, msg6
mov edx, lmsg6
int 80h

; Print on screen the message 7
mov eax, 4
mov ebx, 1
mov ecx, msg7
mov edx, lmsg7
int 80h

; Print on screen the message 8
mov eax, 4
mov ebx, 1
mov ecx, msg8
mov edx, lmsg8
int 80h

; We get the option selected.
mov ebx,0
mov ecx,opc
mov edx,2
mov eax,3
int 80h

mov ah, [opc] ; Move the selected option to the registry ah
sub ah, '0' ; Convert from ascii to decimal

; We compare the value entered by the user to know what operation to perform.

cmp ah, 1
je add
cmp ah, 2
je subtract
cmp ah, 3
je multiply
cmp ah, 4
je divide

; If the value entered by the user does not meet any of the above
; conditions then we show an error message and we close the program.
mov eax, 4
mov ebx, 1
mov ecx, msg10
mov edx, lmsg10
int 80h

jmp exit

add:
; We keep the numbers in the registers eax and ebx
mov al, [num1]
mov bl, [num2]

; Convert from ascii to decimal
sub al, '0'
sub bl, '0'

; Add
add al, bl

; Conversion from decimal to ascii
add al, '0'

; We move the result
mov [result], al

; Print on screen the message 9
mov eax, 4
mov ebx, 1
mov ecx, msg9
mov edx, lmsg9
int 80h

; Print on screen the result
mov eax, 4
mov ebx, 1
mov ecx, result
mov edx, 2
int 80h

; We end the program
jmp exit

subtract:
; We keep the numbers in the registers eax and ebx
mov al, [num1]
mov bl, [num2]

; Convert from ascii to decimal
sub eax, '0'
sub ebx, '0'

; Subtract
sub al, bl

; Conversion from decimal to ascii
add al, '0'

; We move the result
mov [result], al

; Print on screen the message 9
mov eax, 4
mov ebx, 1
mov ecx, msg9
mov edx, lmsg9
int 80h

; Print on screen the result
mov eax, 4
mov ebx, 1
mov ecx, result
mov edx, 1
int 80h

; We end the program
jmp exit

multiply:

; We store the numbers in registers ax and bx
mov al, [num1]
mov bl, [num2]

; Convert from ascii to decimal
sub al, '0'
sub bl, '0'

; Multiply. AL = AX x BX
mul bl

; Conversion from decimal to ascii
add ax, '0'

; We move the result
mov [result], ax

; Print on screen the message 9
mov eax, 4
mov ebx, 1
mov ecx, msg9
mov edx, lmsg9
int 80h

; Print on screen the result
mov eax, 4
mov ebx, 1
mov ecx, result
mov edx, 1
int 80h

; We end the program
jmp exit

divide:

; We store the numbers in registers ax and bx
mov al, [num1]
mov bl, [num2]

mov dx, 0
mov ah, 0

; Convert from ascii to decimall
sub al, '0'
sub bl, '0'

; Division. AL = AX / BX
div bl

; Conversion from decimal to ascii
add ax, '0'
; We move the result
mov [result], ax

; Print on screen the message 9
mov eax, 4
mov ebx, 1
mov ecx, msg9
mov edx, lmsg9
int 80h

; Print on screen the result
mov eax, 4
mov ebx, 1
mov ecx, result
mov edx, 1
int 80h

; We end the program
jmp exit

exit:
; Print on screen two new lines
mov eax, 4
mov ebx, 1
mov ecx, nlinea
mov edx, lnlinea
int 80h
; End the program
mov eax, 1
mov ebx, 0
int 80h

Offline Bryant Keller

  • Forum Moderator
  • Full Member
  • *****
  • Posts: 360
  • Country: us
    • About Bryant Keller
Re: Help with my Calculator (Division) - Linux x86
« Reply #5 on: March 03, 2012, 04:51:24 PM »
One small "bug". You're printing a null terminator. You have two options in "correcting" it. You can either remove all those null terminators which will make the sys_write contain the correct length, or you can subtract 1 from the length to ignore that extra null byte. I like to keep the null byte, if you ever decide to change sys_write to printf, it'll already be zero terminated.

Code: [Select]
section .data

; Messages

msg1 db 10,'-Calculator-',10,0
lmsg1 equ $ - msg1 - 1

msg2 db 10,'Number 1: ',0
lmsg2 equ $ - msg2 - 1

msg3 db 'Number 2: ',0
lmsg3 equ $ - msg3 - 1

msg4 db 10,'1. Add',10,0
lmsg4 equ $ - msg4 - 1

msg5 db '2. Subtract',10,0
lmsg5 equ $ - msg5 - 1

msg6 db '3. Multiply',10,0
lmsg6 equ $ - msg6 - 1

msg7 db '4. Divide',10,0
lmsg7 equ $ - msg7 - 1

msg8 db 'Operation: ',0
lmsg8 equ $ - msg8 - 1

msg9 db 10,'Result: ',0
lmsg9 equ $ - msg9 - 1

msg10 db 10,'Invalid Option',10,0
lmsg10 equ $ - msg10 - 1

nlinea db 10,10,0
lnlinea equ $ - nlinea - 1

section .bss

; Spaces reserved for storing the values ??provided by the user.

opc: resb 2
num1: resb 2
num2: resb 2
result: resb 2

section .text

global _start

_start:

; Print on screen the message 1
mov eax, 4
mov ebx, 1
mov ecx, msg1
mov edx, lmsg1
int 80h

; Print on screen the message 2
mov eax, 4
mov ebx, 1
mov ecx, msg2
mov edx, lmsg2
int 80h

; We get num1 value.
mov eax, 3
mov ebx, 0
mov ecx, num1
mov edx, 2
int 80h

; Print on screen the message 3
mov eax, 4
mov ebx, 1
mov ecx, msg3
mov edx, lmsg3
int 80h

; We get num2 value.
mov eax, 3
mov ebx, 0
mov ecx, num2
mov edx, 2
int 80h

; Print on screen the message 4
mov eax, 4
mov ebx, 1
mov ecx, msg4
mov edx, lmsg4
int 80h

; Print on screen the message 5
mov eax, 4
mov ebx, 1
mov ecx, msg5
mov edx, lmsg5
int 80h

; Print on screen the message 6
mov eax, 4
mov ebx, 1
mov ecx, msg6
mov edx, lmsg6
int 80h

; Print on screen the message 7
mov eax, 4
mov ebx, 1
mov ecx, msg7
mov edx, lmsg7
int 80h

; Print on screen the message 8
mov eax, 4
mov ebx, 1
mov ecx, msg8
mov edx, lmsg8
int 80h

; We get the option selected.
mov ebx,0
mov ecx,opc
mov edx,2
mov eax,3
int 80h

mov ah, [opc] ; Move the selected option to the registry ah
sub ah, '0' ; Convert from ascii to decimal

; We compare the value entered by the user to know what operation to perform.

cmp ah, 1
je add
cmp ah, 2
je subtract
cmp ah, 3
je multiply
cmp ah, 4
je divide

; If the value entered by the user does not meet any of the above
; conditions then we show an error message and we close the program.
mov eax, 4
mov ebx, 1
mov ecx, msg10
mov edx, lmsg10
int 80h

jmp exit

add:
; We keep the numbers in the registers eax and ebx
mov al, [num1]
mov bl, [num2]

; Convert from ascii to decimal
sub al, '0'
sub bl, '0'

; Add
add al, bl

; Conversion from decimal to ascii
add al, '0'

; We move the result
mov [result], al

; Print on screen the message 9
mov eax, 4
mov ebx, 1
mov ecx, msg9
mov edx, lmsg9
int 80h

; Print on screen the result
mov eax, 4
mov ebx, 1
mov ecx, result
mov edx, 2
int 80h

; We end the program
jmp exit

subtract:
; We keep the numbers in the registers eax and ebx
mov al, [num1]
mov bl, [num2]

; Convert from ascii to decimal
sub eax, '0'
sub ebx, '0'

; Subtract
sub al, bl

; Conversion from decimal to ascii
add al, '0'

; We move the result
mov [result], al

; Print on screen the message 9
mov eax, 4
mov ebx, 1
mov ecx, msg9
mov edx, lmsg9
int 80h

; Print on screen the result
mov eax, 4
mov ebx, 1
mov ecx, result
mov edx, 1
int 80h

; We end the program
jmp exit

multiply:

; We store the numbers in registers ax and bx
mov al, [num1]
mov bl, [num2]

; Convert from ascii to decimal
sub al, '0'
sub bl, '0'

; Multiply. AL = AX x BX
mul bl

; Conversion from decimal to ascii
add ax, '0'

; We move the result
mov [result], ax

; Print on screen the message 9
mov eax, 4
mov ebx, 1
mov ecx, msg9
mov edx, lmsg9
int 80h

; Print on screen the result
mov eax, 4
mov ebx, 1
mov ecx, result
mov edx, 1
int 80h

; We end the program
jmp exit

divide:

; We store the numbers in registers ax and bx
mov al, [num1]
mov bl, [num2]

mov dx, 0
mov ah, 0

; Convert from ascii to decimall
sub al, '0'
sub bl, '0'

; Division. AL = AX / BX
div bl

; Conversion from decimal to ascii
add ax, '0'
; We move the result
mov [result], ax

; Print on screen the message 9
mov eax, 4
mov ebx, 1
mov ecx, msg9
mov edx, lmsg9
int 80h

; Print on screen the result
mov eax, 4
mov ebx, 1
mov ecx, result
mov edx, 1
int 80h

; We end the program
jmp exit

exit:
; Print on screen two new lines
mov eax, 4
mov ebx, 1
mov ecx, nlinea
mov edx, lnlinea
int 80h
; End the program
mov eax, 1
mov ebx, 0
int 80h

About Bryant Keller
bkeller@about.me