1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168
| jmp main msg db '' stsave db 'save to disk...' done db 'done' wrm db 10 ; 读取扇区数量 diskaddr db 0xc8 ;扇区初始位置 gbl dw 0x1000;数据加载到这里 逻辑地址 proc dw 0x0000,0x1000
main: ;----------初始化----- mov ax,0x7c0 mov ds,ax mov ax,0xb800
mov es,ax mov ax,0x00 mov ss,ax xor sp,sp
;---------end----- ;call save_as_disk
;call exit xor si,si xor ch,ch mov cl,[wrm]
lr: call read_disk mov al,[diskaddr] inc al mov [diskaddr],al loop lr call far [proc] mov ax,0x1e00 mov ds,ax ;call show_by call exit
save_as_disk: ; 参数bx[ds:bx],cx 压栈 dx ax bx ; 写扇区数量 mov al,0x01 mov dx,0x1f2 out dx,al
inc dx mov al,0xc8 ; 第一百个扇区 out dx,al inc dx ;--0x1f4---- mov al,0x00 out dx,al inc dx ;-----0x1f5---- mov al,0x00 out dx,al inc dx ; -------0x1f6---- mov al,0xe0 ; 1110 0000 out dx,al ;---------- inc dx mov al,0x30 out dx,al ; 接下来判断硬盘是否可读 .waits: in al,dx ;观察 0x1f7端口bit位状态 and al,0x88 ; 0x88=10001000 cmp al,0x08 ; 0000 1000 jnz .waits mov dx,0x1f0 mov cx,256 .save: ;要写入的字数量在cx中 mov ax,'wh' out dx,ax ; ds:bx add bx,0x02 loop .save call exit
show: ; 参数: [ds:bx]bx(地址) 和 cx(字节数) PS:将bx,ax和cx压栈 mov al,[ds:bx] mov ah,0x07 mov [es:si],ax add si,0x02 inc bx loop show ret
read_disk: ; 压栈: dx, bx ax cx----------------------------------------------- push ds push cx
xor bx,bx
; 读取扇区数 mov al,0x01 mov dx,0x1f2 out dx,al
inc dx mov al,[diskaddr] out dx,al inc dx ;-----0x1f4 mov al,0x00 out dx,al inc dx ;------0x1f5 mov al,0x00 out dx,al inc dx ;-------0x1f6 mov al,0xe0 out dx,al inc dx
mov al,0x20 out dx,al .waits: in al,dx ;观察 0x1f7端口bit位状态 and al,0x88 ; 0x88=10001000 cmp al,0x08 ; 0000 1000 jnz .waits mov cx,256 mov dx,0x1f0
mov ax,[gbl] mov ds,ax
.read: in ax,dx mov [ds:si],ax add si,2 ;mov byte [es:si],0x07 loop .read
pop cx pop ds ;mov ds,ax
ret ;---------------------------------------------------------------------
show_by: push ds mov ax,[ds:gbl] mov ds,ax xor bx,bx mov cx,512 call show pop ds call exit
exit: hlt jmp near exit
times 510-($-$$) db 0 dw 0xaa55
|