这些是汇编教程的最后一个部分了。第一次尝试利用思维导图的方式来做学习记录,有些许收货,比单纯只看教程来得深刻。
不过代码还是写得少,虽然知道了关于汇编的一些知识,但是要真正去写汇编代码,估计还有不少难度
7个章节都在讲解保护模式下的编程,因为兼容性原因,这里有很多很多的知识点。很难记忆。
另外这是一分入门的教程,所以当中还有不少知识点是可以更深入的挖掘的。
寒假的汇编了解到这里就算一个段落。明天最晚后天就会开一个新的内容来学习。应该会是对面线对象更深入的研究。
mindmap下载地址www.xmind.net/share/atskyline/protected-mode-programming-13-19/
- [BITS 16] ;用16位进行编译
- org 07c00h;设置起始位置
- jmp main
- gdt_table_start: ;开始填充描述符表
- gdt_null: ;Inter规定段描述符表的第一个表项必须为0
- dd 0H
- dd 0H
- gdt_data_addr equ $-gdt_table_start ;数据段描述符开始位置
- gdt_data:
- dw 07FFH
- dw 0h
- db 0h
- db 10010010b
- db 11000000b
- db 0
- gdt_video_addr equ $-gdt_table_start;显存的段描述符
- gdt_video:
- dw 0FFH ;显存段界限为1M
- dw 8000H
- db 0Bh
- db 10010010b
- db 11000000b
- db 0
- gdt_code_addr equ $-gdt_table_start ;代码段描述符位置
- gdt_code:
- dw 07FFH
- dw 1H
- db 80h
- db 10011010b
- db 11000000b
- db 0
- gdt_table_end:
- ;设置描述符表所在位置及大小
- gdtr_addr:
- dw gdt_table_end-gdt_table_start-1;段描述符表长度
- dd gdt_table_start;段描述符表基地址
- main:
- ;初始化数据段描述符基地址
- xor eax,eax ;清空eax
- add eax,data_32
- mov word [gdt_data+2],ax
- shr eax,16 ;右移16位
- mov byte [gdt_data+4],al
- mov byte [gdt_data+7],ah
- ;初始化代码段描述符基地址
- xor eax,eax
- add eax,code_32
- mov word [gdt_code+2],ax
- shr eax,16
- mov byte [gdt_code+4],al
- mov byte [gdt_code+7],ah
- cli ;废除中断向量表
- lgdt [gdtr_addr] ;让cpu读取gdtr_addr所指向的内存内容保存到GDT寄存器
- ;开启A20地址线
- enable_a20:
- in al,92h
- or al,00000010b
- out 92h,al
- ;设置CR0寄存器第一位为1
- mov eax,cr0
- or eax,1
- mov cr0,eax
- ;跳转到保护模式
- jmp dword gdt_code_addr:0
- [BITS 32] ;用32位进行编译
- data_32:
- db "hello world"
- code_32:
- mov ax,gdt_data_addr
- mov ds,ax
- mov ax,gdt_video_addr
- mov gs,ax
- mov cx,11
- mov edi,(80*10+12)*2
- mov bx,0
- mov ah,0ch
- s:mov al,[ds:bx]
- mov [gs:edi],al
- mov [gs:edi+1],ah
- inc bx
- add edi,2
- loop s
- jmp $
- times 510-($-$$) db 0
- dw 0xAA55