Orange’s学习笔记(一)

伪汇编指令ORG
学习操作系统两个多月以来,一直对org这个伪汇编指令似懂非懂,拿Orange’s的一个最简单的引导扇区代码来说

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,16					;CX = 串长度
	mov ax,01301h				;AH = 13h,AL = 01h
	mov bx,000ch				;页号为0(BH = 0) 黑底红字(BL = 0Ch,高亮)
	mov dl,0
	int 10h						;10h号中断
	ret
BootMessage:	db 	"Hello, OS world!"
times	510-($-$$)	db	0	   ;填充剩下的空间,使生成的二进制代码恰好为512字节
dw	0xAA55

这段代码的org 07c00h指的是,这段程序将来要加载到偏移地址为07c00h的地方,所以在编译器编译时会将标号代表的相对地址(编译后的程序代码地址从0开始)+07c00h(org指明的地址值)作为编译后标号所在位置的实际数值,ep:看第16行标号BootMessage,不考虑org,编译后的二进制代码在文件中地址的偏移为0x1E,加上org指定的地址值,则第8行指令编译出来的BootMessage所占空间存储的数值应该是0x7C1E,用二进制文件查看器查看,如下图:Orange’s学习笔记(一)_第1张图片
其中的B8 1E 7C机器码对应的就是第8行的mov ax,BootMessage指令。
如果我们去掉org这条指令编译之后,得到的机器码,如下图:Orange’s学习笔记(一)_第2张图片
可以看出其中表示的地址偏移值为0x001E。
org伪指令其实仅仅是个开始,在学习Orange’s过程中问题很多,前前后后我看过很多遍的书,每次重看都有新的收获,但是还有很多搞不明白的,所以想写出来,既与大家分享了学习经验也想获得一些指点

你可能感兴趣的:(Orange-s学习)