You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
120 lines
2.5 KiB
120 lines
2.5 KiB
#generate 16-bit code
|
|
.code16
|
|
|
|
#hint the assembler that here is the executable code located
|
|
.text
|
|
.globl _start;
|
|
#boot code entry
|
|
_start:
|
|
jmp _boot #jump to boot code
|
|
welcome: .asciz "Hello, new World\n\r" #here we define the string
|
|
enter_number: .asciz "Enter a number: \n\r"
|
|
lower_msg: .asciz "\nYour number is to low :( \n\r" # 26
|
|
higher_msg: .asciz "\nYour number is to high :( \n\r" # 27
|
|
winner_msg: .asciz "\nYour are the CAMPION, :D \n\r" # 26
|
|
|
|
.macro mWriteString str #macro which calls a function to print a string
|
|
leaw \str, %si
|
|
call .writeStringIn
|
|
.endm
|
|
|
|
# function to print the string
|
|
.writeStringIn:
|
|
lodsb
|
|
orb %al, %al
|
|
jz .writeStringOut
|
|
movb $0x0e, %ah
|
|
int $0x10
|
|
jmp .writeStringIn
|
|
.writeStringOut:
|
|
ret
|
|
|
|
.type get_number, @function
|
|
get_number:
|
|
|
|
# save state before function
|
|
push %bp
|
|
mov %sp, %bp
|
|
|
|
push %bx
|
|
push %cx
|
|
# Start of function
|
|
mWriteString enter_number
|
|
|
|
mov $0, %ah
|
|
mov $0, %al
|
|
int $0x16
|
|
|
|
mov $0x0E, %ah
|
|
int $0x10
|
|
|
|
pop %cx
|
|
pop %bx
|
|
|
|
mov %bp, %sp
|
|
pop %bp
|
|
ret
|
|
|
|
.type string_to_int, @function
|
|
string_to_int:
|
|
/* Converts a string to an integer. Returns the integer in %rax.
|
|
* %rax: Address of string to convert.
|
|
*/
|
|
push %bp
|
|
mov %sp, %bp
|
|
|
|
push %bx
|
|
push %cx
|
|
|
|
mov %ax, %dx
|
|
|
|
cmp $47, %dx
|
|
jl not_a_num
|
|
cmp $57, %dx
|
|
jg not_a_num
|
|
# I multiply by 10 to shift the number one placement to the right to add the newest integer.
|
|
sub $48, %dx
|
|
jmp convertdone # In ascii, numbers start at 0 = 48, 1 = 49, 2 = 50 and so on. So I subtract 48 to get the digit.
|
|
|
|
not_a_num:
|
|
xor %dx, %dx
|
|
|
|
convertdone:
|
|
|
|
pop %cx
|
|
pop %bx
|
|
|
|
mov %bp, %sp
|
|
pop %bp
|
|
ret
|
|
|
|
|
|
_boot:
|
|
mWriteString welcome
|
|
|
|
guess:
|
|
call get_number
|
|
xor %ah, %ah
|
|
call string_to_int
|
|
|
|
cmp $5, %dx
|
|
|
|
jl if_lower
|
|
je if_eg
|
|
jg if_higher
|
|
|
|
if_lower:
|
|
mWriteString lower_msg
|
|
jmp guess
|
|
|
|
if_higher:
|
|
mWriteString higher_msg
|
|
jmp guess
|
|
|
|
if_eg:
|
|
mWriteString winner_msg
|
|
|
|
#move to 510th byte from the start and append boot signature
|
|
. = _start + 510
|
|
.byte 0x55
|
|
.byte 0xaa
|
|
|