x86汇编学习-jmp指令和helloworld的改进-10

322 阅读2分钟

jmp指令

处理器执行指令的顺序从低地址到高地址依次执行 捕获.PNG
跳转: 处理器去别的地方执行指令 捕获.PNG
跳转指令格式
jmp 段地址:偏移地址

计算机启动后是如何进入操作系统的

8086的CS寄存器初始状态FFFF IP寄存器初始状态0000 所以8086的第一条指令在FFFF0处
8086能访问的最大范围是FFFFF FFFF0到FFFFF只有16字节 这个空间是不够操作系统使用的 操作系统存储在硬盘上
ROM BIOS里面固化了指令从外部存储设备(硬盘)读取数据
主引导扇区的加载

捕获.PNG

对打印hello world程序的改进

原来的打印hello world程序只能在dbg模式下才能运行 因为在设置字符后剩下的指令都是填充字节 CPU无法正确执行
使用jmp指令让程序卡住

start:
	mov ax, 0xb800
	mov ds, ax
	
	mov byte[0x00], 'H'
	mov byte[0x01], 0x06

	mov byte[0x02], 'e'
	mov byte[0x03], 0x06
	
	mov byte[0x04], 'l'
	mov byte[0x05], 0x06
	
	mov byte[0x06], 'l'
	mov byte[0x07], 0x06
	
	mov byte[0x08], 'o'
	mov byte[0x09], 0x06
	
	mov byte[0x0a], ' '
	mov byte[0x0b], 0x06
	
	mov byte[0x0c], 'W'
	mov byte[0x0d], 0x06
	
	mov byte[0x0e], 'o'
	mov byte[0x0f], 0x06
	
	mov byte[0x10], 'r'
	mov byte[0x11], 0x06
	
	mov byte[0x12], 'l'
	mov byte[0x13], 0x06
	
	mov byte[0x14], 'd'
	mov byte[0x15], 0x06

loop:
	; 主引导扇区会被加载到07C00处 第一条代码
	; CPU会重复执行这条指令 程序卡住
	jmp 0x0000:0x7c00+loop

current:
	times 510-(current-start) db 0

db 0x55, 0xaa

使用bochs.exe的执行结果
捕获.PNG