日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

x86汇编语言-从实模式到保护模式----第五章

發布時間:2023/12/10 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 x86汇编语言-从实模式到保护模式----第五章 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
  • 注釋由';'開始。
  • 將顯存映射到地址空間里,0xB8000~0xBFFFF。
  • Intel的處理器不允許將一個立即數傳送到段寄存器,只允許這樣的指令:
    mov 段寄存器,通用寄存器 mov 段寄存器,內存單元
  • 為了方便,多數匯編語言編譯器允許在指令中直接使用字符的字面值來代替數值形式的ASCII碼,如:
    mov byte [es:0x00], 'L' mov byte [es:0x00], 0x4c
  • 為了訪問內存單元,需要給出段地址和偏移地址。在mov byte [0x00], 'L'中,物理地址=DS左移4位+0x00。關鍵字byte用來修飾目的操作數。如mov [0x00], al和mov al, [0x02]則不需要。
  • mov指令的目的操作數不允許為立即數,而且,目的操作數和源操作數不允許同時為內存單元。因此,如mov 0x1c, al和mov [0x01], [0x02]都是錯誤的。
  • 匯編地址是指源程序編譯期間,編譯器為每條指令確定的匯編地址,指示該指令相對于程序或者段起始處的距離,以字節計。當編譯后的程序裝入物理內存后,它又是該指令在內存段內的偏移地址。
  • 在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位的二進制數:被除數在AX中,除數由8位通用寄存器或者內存單元提供。指令執行后,商在寄存器AL中,余數在寄存器AH中。比如:
    div cl div byte [0x0023]

    任何時候,只要是在指令中涉及內存地址的,都允許使用段超越前綴。如:

    div byte [cs:0x0023] div byte [es:0x0023]
  • 32位的二進制數除以16位的二進制數:被除數高16位在DX,低16位在AX,除數由16位的通用寄存器或者內存單元提供。指令執行后,商在AX中,余數在DX中。
  • 異或操作xor:xor指令的兩個操作數具有相同的數據寬度。對于清零操作,xor比 mov更高效。
  • 相對近轉移:
    infi: jmp near infi

    關鍵字near表示目標位置在當前代碼段內,更重要的是,指示相對量是16位的。實際上,這是3字節指令,操作碼是0xE9,后跟兩字節的操作數。但是,該操作數并非目的位置的偏移地址,而是目標位置相對于當前指令的偏移量(以字節為單位)。在編譯階段,編譯器用目標位置的匯編地址減去當前指令的匯編地址,再減去當前指令的長度(3B),得到了jump near infi的實際操作數。

  • 主引導扇區最后兩個字節數據為0x55和0xAA。
    dw 0xaa55 ;或者 db 0x55, 0xaa
  • 偽指令times可用于重復它后面的指令若干次。如
    times 20 mov ax, bx?
  • 書上源代碼:
    ;代碼清單5-1 ;文件名:c05_mbr.asm;文件說明:硬盤主引導扇區代碼;創建日期:2011-3-31 21:15 mov ax,0xb800 ;指向文本模式的顯示緩沖區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;設置數據段的基地址mov cx,csmov ds,cx;求個位上的數字mov dx,0div bxmov [0x7c00+number+0x00],dl ;保存個位上的數字;求十位上的數字xor dx,dxdiv bxmov [0x7c00+number+0x01],dl ;保存十位上的數字;求百位上的數字xor dx,dxdiv bxmov [0x7c00+number+0x02],dl ;保存百位上的數字;求千位上的數字xor dx,dxdiv bxmov [0x7c00+number+0x03],dl ;保存千位上的數字;求萬位上的數字 xor dx,dxdiv bxmov [0x7c00+number+0x04],dl ;保存萬位上的數字;以下用十進制顯示標號的偏移地址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 ;無限循環 number db 0,0,0,0,0times 203 db 0db 0x55,0xaa

    ?

轉載于:https://www.cnblogs.com/hlk09/p/9780596.html

總結

以上是生活随笔為你收集整理的x86汇编语言-从实模式到保护模式----第五章的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。