小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

學習x86匯編語言7 使用INT13讀取軟盤數(shù)據(jù)

 啟云_9137 2020-08-22
學習x86匯編語言7 使用INT13讀取軟盤數(shù)據(jù)

一、本章使用工具

  • nasm
  • FloppyWriter
  • bochs

二、軟盤存儲介紹

  • 1.44M的軟盤有2面
  • 每面80個柱面(簇)
  • 一個柱面18個扇區(qū)
  • 每個扇區(qū)有512字節(jié)
學習x86匯編語言7 使用INT13讀取軟盤數(shù)據(jù)
學習x86匯編語言7 使用INT13讀取軟盤數(shù)據(jù)

總容量:280×18×512=1474560(字節(jié))280 \times 18 \times 512=1474560(字節(jié))280×18×512=1474560(字節(jié))

三、BIOS int13功能

BIOS的int13 中斷是擴展的磁盤讀取功能。入口參數(shù):

  • ah= int 13H 的功能號(2表示讀扇區(qū)、3表示寫扇區(qū))
  • al= 讀取/寫入的扇區(qū)數(shù)
  • ch= 磁道號
  • cl= 扇區(qū)號
  • dh= 磁頭號(對于軟盤即面號,對軟盤一個面用一個磁頭來讀寫)
  • dl= 驅動器號 軟驅從0開始,0:軟驅A 、 1:軟驅B硬盤從80H開始,80H:硬盤C 、 81H: 硬盤D

es:bx 指向接收從扇區(qū)讀入數(shù)據(jù)的內(nèi)存區(qū)/指向將寫入磁盤的數(shù)據(jù)

返回參數(shù):

  • 操作成功,(ah)= 0 ,(al)= 讀取/寫入的扇區(qū)數(shù)
  • 操作失敗,(ah)= 出錯代碼

一段寫磁盤示例讀屏幕到軟盤上,1屏4000Byte,使用8個扇區(qū),使用磁盤的0面0道1~8扇區(qū)存儲。

assume cs:codecode segment start: mov ax,0B800h mov es,ax mov bx,0 mov al,8 mov ch,0 mov cl,1 mov dl,0 mov dh,0 mov ah,3 int 13h mov ax,4c00h int 21H code ends end start

一段讀磁盤示例讀0面0道1扇區(qū)到 0000:0200H

assume cs:codecode segment    start:  mov ax,0            mov es,ax            mov bx,200H                        mov al,1            mov ch,0            mov cl,1            mov dl,0            mov dh,0            mov ah,2            int 13h                        mov ax,4c00h            int 21H    code ends    end start

四、引導程序源代碼

  • 帶讀磁盤的功能,把磁盤數(shù)據(jù)加載到內(nèi)存的 0x0820處。
  • 從第2個扇區(qū)開始讀,因為第一個扇區(qū)給啟動程序用了。
;%define _BOOT_DEBUG_ ; 做Boot Sector時把這行注釋掉 ; 啟用這行就用nasm Boot.asm -o Boot.com生成.com文件用于調(diào)試%ifdef _BOOT_DEBUG_ org 0100h%else org 07c00h%endifCYLS EQU 10init: MOV AX,0 MOV SS,AX MOV SP,0x7c00 ; 堆??臻g,從0x7c00向前 MOV DS,AX MOV AX,0x0820 ; 把磁盤數(shù)據(jù)加載到內(nèi)存0x0820處。 0x8000~0x81ff的512字節(jié)給啟動區(qū)用的,所以從0x0820開始 MOV ES,AX ; 初始化磁盤接口 MOV CH,0 ; 柱面 0 MOV DH,0 ; 磁頭 0 MOV CL,2 ; 扇區(qū) 2readloop: MOV SI,0 ; 記錄失敗次數(shù)retry: MOV AH,0x02 ; 0x02 讀磁盤 MOV AL,1 ; 讀1個扇區(qū) MOV BX,0 MOV DL,0x00 ; A驅動器 INT 0x13 ; BIOS 讀磁盤功能 JNC next ; 成功跳轉 ADD SI,1 ; 失敗加一次 CMP SI,5 ; 到5次就跳到error JAE error MOV AH,0x00 ; 復位磁盤功能 MOV DL,0x00 INT 0x13 ; 重置磁盤驅動器 JMP retry ; 重試 next: MOV AX,ES ; 內(nèi)存地址向后移動0x0020 ADD AX,0x0020 MOV ES,AX ; 通過AX給ES加0x0020 ADD CL,1 ; 扇區(qū)+1 CMP CL,18 ; 有沒有到18個扇區(qū) JBE readloop ; CL<=18,就跳到 readloop MOV CL,1 ADD DH,1 CMP DH,2 JB readloop ; 如果 DH < 2 ,則跳到readloop MOV DH,0 ADD CH,1 CMP CH,CYLS JB readloop ; 如果CH<CYLS , 則跳到readloop JMP successprint: # 字符串顯示到屏幕 MOV AL, [SI] ADD SI, 1 CMP AL, 0 JE end MOV AH, 0x0e MOV BX, 15 INT 0x10 JMP printend: HLT JMP end ; 無限循環(huán)error: ; 打印錯誤信息 MOV SI, error_msg JMP printsuccess: MOV SI, success_msg JMP printBootMessage: DB 'Hello, MY OS!' ; 想要開機后在屏幕上顯示的字符串 DB 0success_msg: DB 'Success' ; 成功 DB 0error_msg: DB 'Error' ; 失敗 DB 0 times 510-($-$$) db 0 ; 填充剩下的空間,使生成的二進制代碼恰好為512字節(jié) $$表示一個section的開始處匯編后地址 DW 0xaa55 ; 結束標志

啟動后如無異常屏幕只會顯示Success。后面章節(jié)再加載主體程序。

    本站是提供個人知識管理的網(wǎng)絡存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權內(nèi)容,請點擊一鍵舉報。
    轉藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多