NASM - The Netwide Assembler
NASM Forum => Programming with NASM => Topic started by: bardak on June 06, 2015, 10:28:51 PM
-
Hello
Im trying to make bootable calculator by using assembly. But im kind of beginner. I spent all of my day on this but altough that could not do it. I found calculator code and bootable code on the internet pages and can run them successfully one by one.
But when i try to combine them it dosent work. I really need help on this. If anyone have an idea I would like to hear that.
This is the calculator code that i use :
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 al and bl
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 al and bl
mov al, [num1]
mov bl, [num2]
; Convert from ascii to decimal
sub al, '0'
sub bl, '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 al and bl
mov al, [num1]
mov bl, [num2]
; Convert from ascii to decimal
sub al, '0'
sub bl, '0'
; Multiply. AX = AL x BL
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
and this one for creating bootable disc:
[BITS 16] ;tell the assembler that its a 16 bit code
[ORG 0x7C00] ;Origin, tell the assembler that where the code will
;be in memory after it is been loaded
JMP $ ;infinite loop
TIMES 510 - ($ - $$) db 0 ;fill the rest of sector with 0
DW 0xAA55 ; add boot signature at the end of bootloader
How should i combine them together?
-
Just swap your bootloader for one that boots Linux and you're all set!
Seriously, bardak, your calculator code is for Linux, and is not very suitable as a starting point for a bootable calculator. Since you've got it you might want to test it a little more. I think you'll find that its abilities are pretty limited. If you're going to go to the bother of making it bootable, write a new one. If you write it for dos, as a "dosless .com file" (using BIOS interrupts), it'll be easy to make it bootable.
Generally, the only thing for a bootsector to do is load something else. It might make an interesting challenge to see how good a calculator you could squeeze into 512 bytes (less required housekeeping). I probably won't get into the mood to play with it... but it's interesting...
Failing that, we can discuss how to load something else with your bootloader and jump to it. Could be anything - a whole OS or just a calculator. Whatever it is will have to start with appropriate code - 16-bit real mode, but you can go on from there if you want to... Happy bootin'!
Best,
Frank