#generate 16-bit code .code16 #hint the assembler that here is the executable code located .text .globl _start; #boot code entry _start: welcome: .asciz "Welcome to this very fine Guessing game \n\r" #here we define the string enter_number: .asciz "Enter a number: \n" lower_msg: .asciz "Your number is to low :( \n" # 26 higher_msg: .asciz "Your number is to high :( \n" # 27 winner_msg: .asciz "Your are the CAMPION, :D \n" # 26 .macro mWriteString str #macro which calls a function to print a string leaw \str, %si call .writeStringIn .endm #jmp _boot # function to print the string .writeStringIn: lodsb orb %al, %al jz .writeStringOut movb $0x0e, %ah int $0x10 jmp .writeStringIn .writeStringOut: ret #jump to boot code mWriteString welcome /* guess: call get_number xor %ah, %ah call string_to_int cmp $5, %dx jl if_lower # rax less then 50 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 #message length hlt */ #_boot: # mWriteString welcome #.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 xor %ax, %ax 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 # 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 .type get_number, @function get_number: # .enter_char: # mov $0, %ah # mov $0, %al # int $0x16 # mov $0x0E, %ah # int $0x10 # jmp .enter_char # 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 */ #move to 510th byte from the start and append boot signature . = _start + 510 .byte 0x55 .byte 0xaa