俺啥也不懂-不知道什么时候才会编写操作系统-一个hello world写一年-汇编如何计算字符串的长度

俺啥也不懂-不知道什么时候才会编写操作系统-一个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。

俺啥也不懂-不知道什么时候才会编写操作系统-一个hello world写一年-最终还是逃不过gdb调试

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值