完善打印功能
为了方便我们今后的调试,我们需要完善打印功能,这样出了什么差错直接print就OK了。我们的打印分为两种:打印字符串和打印地址。
打印字符串
都知道,C语言中的字符串结构长这样:
"Venus" -> 'V' 'e' 'n' 'u' 's' '0x0'
都是几个字符再加上一个空字节0x0。如果要打印字符串,而不是单个字符,在汇编里面,可以对应成一个栈来处理。同目录新建一个print.asm:
print:
pusha ; 将所有东西压入栈
; 记住:一直循环打印栈的字符,直到碰到字符串末0x0
; while (string[i] != 0) { print string[i]; i++ }
start:
mov al, [bx] ; bx相当于字符串参数,是字符串的首位
cmp al, 0 ; al和0比较
je done ; 如果相等,就到了字符串末尾,跳转到结束done
mov ah, 0x0E ; 如果不相等,开始打印,先进入tty模式
int 0x10 ; 直接中断。因为al参数已经有字符了
add bx, 1 ; 如果你把这个栈+1,相当于地址后移一位,这样再打印就是下一个字符串
jmp start ; 递归
done:
popa ; 弹出栈
ret ;