assume cs:code
data segment
strr db 512 dup (0)
strw db 'hello world!',500 dup(0)
data ends
stack segment
dw 100 dup(0)
stack ends
code segment
start:
mov ax, stack
mov ss,ax
mov sp,100
mov ax,data
mov es,ax;取得strr的段地址
push es
;把新的int7c装在7ch*4处\/
mov ax,cs
mov ds,ax
mov si,offset int7c
mov ax,0
mov es,ax
mov di,200h
mov cx,offset int7cend-offset int7c
cld
rep movsb
mov ax,0
mov es,ax
mov word ptr es:[7ch*4],200h
mov word ptr es:[7ch*4+2],0
;把新的int7c装在7ch*4处^
;设定es:bx指向存储读出数据或写入数据的内存区\/
pop es
mov bx,0
;设定es:bx指向存储读出数据或写入数据的内存区^
mov ah,1;写
mov al,1;写入的扇区数
mov dx,2;逻辑扇区号
int 7ch
mov ah,0;读
mov al,1;读出的扇区数
mov dx,2;逻辑扇区号
int 7ch
int7c:
push ax
push bx
push cx
push dx
push ax
push bx
;计算物理磁道号ch,扇区号cl,磁头号dh\/
mov ax,dx
mov dx,0
mov bx,1440
div bx;rem(dx/1440)->dx;int(dx/1440)->ax
push ax
mov ax,dx
mov dx,0
mov bl,18
div bl;int(rem(dx/1440)/18)->al;rem(rem(dx/1440)/18)->ah
mov ch,al
mov cl,ah
add cl,1
pop ax
mov dh,al
;计算物理磁道号ch,扇区号cl,磁头号dh^
pop bx
pop ax
mov dl,0;驱动器号 dl
cmp ah,0
je read
jb sret
cmp ah,1
je write
ja sret
read:;读扇区
push es
push bx
mov ah,2
int 13h
pop bx
pop es
mov dh,10;显示的行号
mov dl,15;显示的列号
mov cl,4ah
mov ax,es
mov ds,ax
mov si,bx
call show_str;调用显示字符串函数
jmp sret
write:;写扇区
push es
push bx
add bx,512;使es:bx指向strw
mov ah,3
int 13h
pop bx
pop es
jmp sret
;显示字符串函数\/
show_str:
push ax
push bx
push cx
push dx
push es
push si
mov al,160
dec dh
mul dh
push ax
mov al,2
dec dl
mul dl
pop si
add si,ax
mov ax,0b800h
mov es,ax
mov bx,0
pop dx
push cx
mov ch,0
s: mov cl,ds:[bx]
jcxz ok
mov al,ds:[bx]
mov es:[si],al
mov es:[si+1],dl
inc bx
add si,2
jmp short s
ok:
pop si
pop es
pop dx
pop cx
pop bx
pop ax
ret
;显示字符串函数^
sret:
pop dx
pop cx
pop bx
pop ax
iret
int7cend:nop
code ends
end start
这个程序的功能是:通过逻辑扇区推算出物理 磁道号、扇区号、磁头号,对此区域进行读写,写入的数据存在strw中,读出的数据存放在strr中,并把读出来的内容显示到屏幕上。
现在的问题是:程序运行后会提示:CS:0000 IP:0077 OP:f0 37 05 0c 02 选择“关闭”终止应用程序,忽略后还会有类似提示,如图:
通过debug调试可以发现程序在运行到 int 13h处出现乱码,但是查看此时的寄存器:磁道号、扇区号、磁头号、软盘符号、写入扇区数,都没有问题,请各位大神帮我看看这是哪出的问题?感激不尽!
------解决思路----------------------
windows 环境下,从 win98 开始就不运行 int13h 直接读写磁盘了吧。