x86汇编语言-从实模式到保护模式----第五章
生活随笔
收集整理的這篇文章主要介紹了
x86汇编语言-从实模式到保护模式----第五章
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
- 注釋由';'開始。
- 將顯存映射到地址空間里,0xB8000~0xBFFFF。
- Intel的處理器不允許將一個立即數(shù)傳送到段寄存器,只允許這樣的指令:
mov 段寄存器,通用寄存器 mov 段寄存器,內存單元 - 為了方便,多數(shù)匯編語言編譯器允許在指令中直接使用字符的字面值來代替數(shù)值形式的ASCII碼,如:
mov byte [es:0x00], 'L' mov byte [es:0x00], 0x4c - 為了訪問內存單元,需要給出段地址和偏移地址。在mov byte [0x00], 'L'中,物理地址=DS左移4位+0x00。關鍵字byte用來修飾目的操作數(shù)。如mov [0x00], al和mov al, [0x02]則不需要。
- mov指令的目的操作數(shù)不允許為立即數(shù),而且,目的操作數(shù)和源操作數(shù)不允許同時為內存單元。因此,如mov 0x1c, al和mov [0x01], [0x02]都是錯誤的。
- 匯編地址是指源程序編譯期間,編譯器為每條指令確定的匯編地址,指示該指令相對于程序或者段起始處的距離,以字節(jié)計。當編譯后的程序裝入物理內存后,它又是該指令在內存段內的偏移地址。
- 在NASM中,每條指令的前面都可以有一個標號,以指示和代表該指令的匯編地址。如:
infi: jmp near infi或者不需要冒號,又或者單獨占用一行位置:
infi:jmp near infi因為infi所在的那一行沒有指令,它的地址就是下一行的地址。
- DB(Declare Byte)、DW(Declare Word)、DD(Declare Double Word)、DQ(Declare Quad Word),均不能超過表達的大小
- 16位的二進制除以8位的二進制數(shù):被除數(shù)在AX中,除數(shù)由8位通用寄存器或者內存單元提供。指令執(zhí)行后,商在寄存器AL中,余數(shù)在寄存器AH中。比如:
div cl div byte [0x0023]任何時候,只要是在指令中涉及內存地址的,都允許使用段超越前綴。如:
div byte [cs:0x0023] div byte [es:0x0023] - 32位的二進制數(shù)除以16位的二進制數(shù):被除數(shù)高16位在DX,低16位在AX,除數(shù)由16位的通用寄存器或者內存單元提供。指令執(zhí)行后,商在AX中,余數(shù)在DX中。
- 異或操作xor:xor指令的兩個操作數(shù)具有相同的數(shù)據(jù)寬度。對于清零操作,xor比 mov更高效。
- 相對近轉移:
infi: jmp near infi關鍵字near表示目標位置在當前代碼段內,更重要的是,指示相對量是16位的。實際上,這是3字節(jié)指令,操作碼是0xE9,后跟兩字節(jié)的操作數(shù)。但是,該操作數(shù)并非目的位置的偏移地址,而是目標位置相對于當前指令的偏移量(以字節(jié)為單位)。在編譯階段,編譯器用目標位置的匯編地址減去當前指令的匯編地址,再減去當前指令的長度(3B),得到了jump near infi的實際操作數(shù)。
- 主引導扇區(qū)最后兩個字節(jié)數(shù)據(jù)為0x55和0xAA。
dw 0xaa55 ;或者 db 0x55, 0xaa - 偽指令times可用于重復它后面的指令若干次。如
times 20 mov ax, bx? - 書上源代碼:
;代碼清單5-1 ;文件名:c05_mbr.asm;文件說明:硬盤主引導扇區(qū)代碼;創(chuàng)建日期:2011-3-31 21:15 mov ax,0xb800 ;指向文本模式的顯示緩沖區(qū)mov es,ax;以下顯示字符串"Label offset:"mov byte [es:0x00],'L'mov byte [es:0x01],0x07mov byte [es:0x02],'a'mov byte [es:0x03],0x07mov byte [es:0x04],'b'mov byte [es:0x05],0x07mov byte [es:0x06],'e'mov byte [es:0x07],0x07mov byte [es:0x08],'l'mov byte [es:0x09],0x07mov byte [es:0x0a],' 'mov byte [es:0x0b],0x07mov byte [es:0x0c],"o"mov byte [es:0x0d],0x07mov byte [es:0x0e],'f'mov byte [es:0x0f],0x07mov byte [es:0x10],'f'mov byte [es:0x11],0x07mov byte [es:0x12],'s'mov byte [es:0x13],0x07mov byte [es:0x14],'e'mov byte [es:0x15],0x07mov byte [es:0x16],'t'mov byte [es:0x17],0x07mov byte [es:0x18],':'mov byte [es:0x19],0x07mov ax,number ;取得標號number的偏移地址mov bx,10;設置數(shù)據(jù)段的基地址mov cx,csmov ds,cx;求個位上的數(shù)字mov dx,0div bxmov [0x7c00+number+0x00],dl ;保存?zhèn)€位上的數(shù)字;求十位上的數(shù)字xor dx,dxdiv bxmov [0x7c00+number+0x01],dl ;保存十位上的數(shù)字;求百位上的數(shù)字xor dx,dxdiv bxmov [0x7c00+number+0x02],dl ;保存百位上的數(shù)字;求千位上的數(shù)字xor dx,dxdiv bxmov [0x7c00+number+0x03],dl ;保存千位上的數(shù)字;求萬位上的數(shù)字 xor dx,dxdiv bxmov [0x7c00+number+0x04],dl ;保存萬位上的數(shù)字;以下用十進制顯示標號的偏移地址mov al,[0x7c00+number+0x04]add al,0x30mov [es:0x1a],almov byte [es:0x1b],0x04mov al,[0x7c00+number+0x03]add al,0x30mov [es:0x1c],almov byte [es:0x1d],0x04mov al,[0x7c00+number+0x02]add al,0x30mov [es:0x1e],almov byte [es:0x1f],0x04mov al,[0x7c00+number+0x01]add al,0x30mov [es:0x20],almov byte [es:0x21],0x04mov al,[0x7c00+number+0x00]add al,0x30mov [es:0x22],almov byte [es:0x23],0x04mov byte [es:0x24],'D'mov byte [es:0x25],0x07infi: jmp near infi ;無限循環(huán) number db 0,0,0,0,0times 203 db 0db 0x55,0xaa?
轉載于:https://www.cnblogs.com/hlk09/p/9780596.html
總結
以上是生活随笔為你收集整理的x86汇编语言-从实模式到保护模式----第五章的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: maven本地库已经有的包了,如何不下载
- 下一篇: j计算机集成维护工具,USBOS v2.