學習x86組合語言7 使用INT13讀取軟盤資料

2021-10-23 15:12:26 字數 3291 閱讀 3968

總容量: 280×18

×512

=1474560(字

節)

280 \times 18 \times 512=1474560(位元組)

280×18

×512

=147

4560

(位元組)

bios的int13 中斷是擴充套件的磁碟讀取功能。

入口引數:

es:bx 指向接收從扇區讀入資料的記憶體區/指向將寫入磁碟的資料

返回引數:

一段寫磁碟示例

讀螢幕到軟盤上,1屏4000byte,使用8個扇區,使用磁碟的0面0道1~8扇區儲存。

assume cs:code

code 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扇區到 0000:0200h

assume cs:code

code 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

;%define _boot_debug_   ; 做boot sector時把這行注釋掉

; 啟用這行就用nasm boot.asm -o boot.com生成.com檔案用於除錯

%ifdef _boot_debug_

org 0100h

%else

org 07c00h

%endif

cyls equ 10

init:

mov ax,0

mov ss,ax

mov sp,0x7c00 ; 堆疊空間,從0x7c00向前

mov ds,ax

mov ax,0x0820 ; 把磁碟資料載入到記憶體0x0820處。 0x8000~0x81ff的512位元組給啟動區用的,所以從0x0820開始

mov es,ax ; 初始化磁碟介面

mov ch,0 ; 柱面 0

mov dh,0 ; 磁頭 0

mov cl,2 ; 扇區 2

readloop:

mov si,0 ; 記錄失敗次數

retry:

mov ah,0x02 ; 0x02 讀磁碟

mov al,1 ; 讀1個扇區

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 ; 記憶體位址向後移動0x0020

add ax,0x0020

mov es,ax ; 通過ax給es加0x0020

add cl,1 ; 扇區+1

cmp cl,18 ; 有沒有到18個扇區

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 ; 如果chjmp success

print: # 字串顯示到螢幕

mov al, [si]

add si, 1

cmp al, 0

je end

mov ah, 0x0e

mov bx, 15

int 0x10

jmp print

end:

hltjmp end ; 無限迴圈

error: ; 列印錯誤資訊

mov si, error_msg

jmp print

success:

mov si, success_msg

jmp print

bootmessage:

db "hello, my os!" ; 想要開機後在螢幕上顯示的字串

db 0

success_msg:

db "success" ; 成功

db 0

error_msg:

db "error" ; 失敗

db 0

times 510-($-$$) db 0 ; 填充剩下的空間,使生成的二進位制**恰好為512位元組 $$表示乙個section的開始處彙編後位址

dw 0xaa55 ; 結束標誌

組合語言 基於X86 學習筆記

1.機器語言 machine language 是一種數字語言,專門設計成唄計算機處理器 cpu 理解。所有x86處理器都理解的共同機器語言。2.組合語言 assembly language 包含助記符書寫的語言。3.組合語言與機器語言是一一對應 one to one 的關係。4.彙編器 assem...

搭建x86組合語言學習環境

masm中包含了8086彙編程式設計中要用到的幾個必需的工具 masm.exe彙編 link.exe連線 debug.exe除錯,edit.com和edlin.com是兩個編輯程式。如下 將這個資料夾拷貝到你習慣的工作盤 我用d盤作工作盤,拷貝後,這些檔案在d masm中 2.安裝dosbox 雙擊...

x86組合語言學習筆記2

乙個簡單的組合語言程式 data sum dword 0 code main proc mov eax,5 add eax,6 mov sum,eax invoke exitprocess,0 main endp 加法指令 add 減法指令 sub 加一指令 inc 減一指令 dec 取補指令 ne...