俺啥也不懂-不知道什么时候才会编写操作系统-一个hello world写一年-操作系统层面的hello
诸位,俺还没研究透10h中断,今天不写这个了,写一下如何计算字符串的长度吧,按照惯例,先把hello world摆上来
org 07c00h ; 告诉编译器程序加载到7c00处
mov ax, cs
mov ds, ax
mov es, ax
call DispStr ; 调用显示字符串例程
jmp $ ; 无限循环
DispStr:
mov ax, BootMessage
mov bp, ax ; ES:BP = 串地址
mov cx, len_string ; CX = 串长度
mov ax, 01301h ; AH = 13, AL = 01h
mov bx, 000ch ; 页号为0(BH = 0) 黑底红字(BL = 0Ch,高亮)
mov dl, 0
int 10h ; 10h 号中断
ret
BootMessage: db "Hello, OS world!"
len_string equ $ - BootMessage
times 510-($-$$) db 0 ; 填充剩下的空间,使生成的二进制代码恰好为512字节
dw 0xaa55 ; 结束标志
不知道,各位有没有试过,在cx=串长度那一行,把cx的值该小,例如move cx,10,我试过了,这个时候,BootMessage是显示不全的,因为长度不够,BootMessage的长度是16。
上面这个代码怎么编译、链接就不讲了,请看俺以前的文章,太啰嗦了,俺本来就啰嗦,这里就不啰嗦了,就提醒一句,这个是最终要生成img的,要在虚拟机里面展示。
$ - BootMessage简单理解就是当前地址减去初始地址,得到BootMessage的长度。
当然还有其它的计算方法,看下面这个代码
org 07c00h ; 告诉编译器程序加载到7c00处
mov ax, cs
mov ds, ax
mov es, ax
call printStr ; 调用显示字符串例程
jmp $ ; 无限循环
printStr:
mov bx, msg
mov bp, bx ; ES:BP = 串地址
call strlen
strlen:
mov ax,bx
calculate:
cmp byte[eax],0
jz finished
inc ax
jmp calculate
finished:
sub ax,bx
mov cx, ax ; CX = 串长度
mov ax, 01301h ; AH = 13, AL = 01h
mov bx, 000ch ; 页号为0(BH = 0) 黑底红字(BL = 0Ch,高亮)
mov dl, 0
int 10h ; 10h 号中断
ret
msg: db "Hello, OS world! A Good Start"
times 510-($-$$) db 0 ; 填充剩下的空间,使生成的二进制代码恰好为512字节
dw 0xaa55 ; 结束标志
这个跟上面的区别,其实就是我把https://asmtutor.com/这个网址下面的第三课内容给糅合进来了,没有太大的变化,最终bp寄存器仍然是接受了msg,为了高度还原作者的意图,把ax换成了bx,然后用ax和bx计算字符串的长度。
这个方法吧,那个cmp byte[eax],0还没完全懂,按照注释,零是字符串的结尾分隔符,Zero is an end of string delimiter
看了几篇使用这个代码的文章,就没有一个讲清楚的,忧伤,这个需要做个试验,不能乱讲。
如果byte[eax]-0==0,jz,否则ax++,继续执行caculate。