Problem with Babystep tutorials
Posted: Wed Nov 07, 2012 3:15 am
Hi,
I'm totally new to assembly.
I've tried the example publish in Babystep 4, it turns out everything just working as expected.
When I start to break up the code, I've got funny result. I know I definitely did something wrong, but no clue to spot it.
what I did was splitting sprint and cprint to a new file name sprint.inc and include it in boot.asm (the original code).
I build it using NASM with this command: nasm boot.asm -f bin -o boot.bin
When I write it to image and boot the VM, I've got the character "W" fill up first few lines.
Here's the mess I've done :
spirnt.inc
boot.asm
Any guru please help to point out the error and how should I do it in the right way?
I'm totally new to assembly.
I've tried the example publish in Babystep 4, it turns out everything just working as expected.
When I start to break up the code, I've got funny result. I know I definitely did something wrong, but no clue to spot it.
what I did was splitting sprint and cprint to a new file name sprint.inc and include it in boot.asm (the original code).
I build it using NASM with this command: nasm boot.asm -f bin -o boot.bin
When I write it to image and boot the VM, I've got the character "W" fill up first few lines.
Here's the mess I've done :
spirnt.inc
Code: Select all
; sprint.inc -- no BIOS print
%macro sprint 3
mov si, %1
jmp %%sprint
%%dochar: cprint %2, %3
%%sprint: lodsb ; string char to AL
cmp al, 0
jne %%dochar ; else we're done
add byte [%2], 1 ; down 1 row
mov byte [%3], 0 ; set cursor back to first column
ret
%endmacro
%macro cprint 2
mov ah, 0x0F ; attrib = white on black
mov cx, ax ; save char/attribute
movzx ax, byte [%1]
mov dx, 160 ; 2 bytes (char/attrib)
mul dx ; for 80 columns
movzx bx, byte [%2]
shl bx, 1 ; times 2 to skip attrib
mov di, 0 ; start of video memory
add di, ax ; add y offset
add di, bx ; add x offset
mov ax, cx ; restore char/attribute
stosw ; write char/attribute
add byte [%2], 1 ; advance to right
ret
%endmacro
Code: Select all
; boot.asm
jmp kmain
%include "sprint.inc"
kmain:
[ORG 0x7C00] ; add to offsets
xor ax, ax ; make it zero
mov ds, ax ; DS=0
mov ss, ax ; stack starts at 0
mov sp, 0x9c00 ; 200h past code start
mov ax, 0xb800 ; text video memory
mov es, ax
sprint msg, ypos, xpos
mov ax, 0xb800 ; look at video mem
mov gs, ax
mov bx, 0x0000 ; 'W'=57 attrib=0F
mov ax, [gs:bx]
mov word [reg16], ax ;look at register
call printreg16
hang:
jmp hang
;-------------------------------------------------------------------------------------------
printreg16:
mov di, outstr16
mov ax, [reg16]
mov si, hexstr
mov cx, 4 ; four places
hexloop:
rol ax, 4 ; leftmost will
mov bx, ax ; become
and bx, 0x0f ; rightmost
mov bl, [si + bx] ; index into hexstr
mov [di], bl
inc di
dec cx
jnz hexloop
mov si, outstr16
sprint outstr16, ypos, xpos
ret
;------------------------------------
xpos db 0
ypos db 0
hexstr db '0123456789ABCDEF'
outstr16 db '0000', 0 ; register value string
reg16 dw 0 ; pass values to printreg16
msg db "Welcome to Simple OS", 0
times 510-($-$$) db 0 ; pad subsequent 510 byte to 0
db 0x55 ; Old BIOS need this to decide that
db 0xAA ; this is boot code.
;==================================