assume cs:codesg
datasg segment
fun_table dw fun0,fun1,fun2,input,error,space
fun0 db ' 0 read floopy','$'
fun1 db ' 1 read floopy','$'
fun2 db ' 2 exit program','$'
input db ' Please input the number[0,1,2]:','$'
error db ' Error ,Notice:the number is 0,1 or 2' ,'$'
space db ' ','$'
row db 8,9,10,12,13
datasg ends
stacksg segment
db 128 dup(0)
stacksg ends
codesg segment
;;;;;;;;;;;;;int 7ch 中段程序开始;;;;;;;;;;;;;;;;;
int7ch_start:
jmp short set
table dw read_floopy,write_floopy
set:
push bx
mov bx,0
mov bl,ah
add bx,bx;根据功能号做相应的变化,以便于调用此中断程序相应的子程序
call word ptr table[bx];调用相应的子程序读或者写软盘
pop bx
iret;中断返回
;;;;;;;;;读取软盘中的数据;;;;;;;;;;;;;;;;;;;;;;
read_floopy:
push ax
push bx
push es
mov ax,0
mov es,ax
mov bx,200h;读取到0000:0200h处
call div_getResult;调用此子程序设置cx和dx的值,也就是进行磁道号,面号,扇区号的设置
mov al,1 ;读取的扇区数是1
mov ah,2 ;调用int 13h的2号功能进行从软盘读取数据
int 13h
pop es
pop bx
pop ax
jmp menu
;;;;;;;;读取软盘中的数据结束;;;;;;;;;;;;;;;;;;;;
;;;;;;;;向软盘中写数据开始;;;;;;;;;;;;;;;;;;;;;;;;;;;;
write_floopy:
push ax
push bx
push es
mov bx,0b800h
mov es,bx
mov bx,0 ;把屏幕上的数据写入软盘
call div_getResult;调用此子程序设置cx和dx的值,也就是进行磁道号,面号,扇区号的设置
mov al,8;因为一屏幕的数据所占大小约为4000KB,而一个扇区的大小是512KB,所以需要8个扇区
mov ah,3;调用int 13h的3号功能项软盘中写数据
int 13h
pop es
pop bx
pop ax
jmp menu
;;;;;;;;向软盘中写数据结束;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;通过除法获得磁道号,面号,扇区号等参数并进行设置cx、dx的子程序开始;;;;;;;;;;;;
div_getResult:
push ax
push bx
push si
push di
mov ax,dx
mov dx,0
mov bx,1440
div bx
mov si,ax;因为下面的程序还要用到ax,所以把得到的面号给si保存起来
mov ax,dx
mov dx,0
mov bx,18
div bx ;此时得到的商即ax中的值是磁道号,余数即dx中的值加1的值是扇区号
add dx,1;
mov cx,ax ;因为ax中的值是磁道号,所以把其给cx
mov ch,cl ;但是磁道号实际上只存放在了al中,所以也就是在cl中,而磁道号是要给ch的,所以要把cl中的值给ch
mov cl,dl ;cl中存放的是扇区号,而dx也就是dl中存放的是扇区号。所以把dl中的值给cl
mov bx,si;用bx做个中转站,因为si是16位的,不能直接赋值给8为的dh
mov dh,bl;把bl中的值即面号给dh
mov dl,0 ;因为我们读的都是软驱,所以dl的值就直接赋值为0了
pop di
pop si
pop bx
pop ax
ret
;;;;;;;;通过除法获得磁道号,面号,扇区号等参数并进行设置cx、dx的子程序结束;;;;;;;;;;;;
;中断程序结束
int7ch_end:nop
;;;;;;;;;;;;;;;;;;;int 7ch 中段程序结束;;;;;;;;;;;;;;;;;;;;;;
start:
;;;;;;;;;;;复制中断程序开始;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
mov ax,0
mov es,ax
mov di,200h
mov ax,cs
mov ds,ax
mov si,offset int7ch_start
mov cx,offset int7ch_end - offset int7ch_start
cld
rep movsb
;;;;;;;;;;;复制中段程序结束;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;设置中断向量;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
mov ax,0
mov es,ax
cli
mov word ptr es:[7ch*4],0
mov word ptr es:[7ch*4+2],0020h
sti
;;;;;;;;;;;设置中断向量;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;测试程序开始;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
mov ax,datasg
mov ds,ax
menu:
mov bx,offset fun_table
mov si,offset row
mov cx,4
print_menu:
call show_str
inc si
add bx,2
loop print_menu
mov ah,0
int 16h
mov dx,1439
cmp al,'0'
je to_read ;是0转到从软驱中读取数据到指定内存的程序
cmp al,'1'
je to_write ;是1转到调用把数据写入软驱的程序
cmp al,'2'
je exit_program ;是2就退出程序
mov si,offset row+4 ;否则的话就是出错了,在13行显示错误信息
mov bx,offset fun_table+8 ;把bx定位到要输出的错误信息
call show_str ;调用输出字符程序输出错误信息
call delay ;延时一会儿
mov si,offset row+4 ;再次定位到现实错误信息的那一行
mov bx,offset fun_table+10 ;把清除错误信息的space的偏移量给bx
call show_str ;把错误信息给清除掉
jmp menu
;是要读取软盘中的数据
to_read:
mov ah,0
int 7ch
call delay
jmp menu
;是要向软盘中写数据
to_write:
mov ah,1
int 7ch
call delay
jmp menu
exit_program:
mov ax,4c00h
int 21h
;;;;;;;显示字符串子程序的开始;;;;;;;;;;;;;;;;;;;;;
show_str:
push ax
push bx
push dx
push si
mov ah,2
mov bh,0
mov dh,ds:[si]
mov dl,20
int 10h ;这时调用int 10h的2号功能定位光标
mov dx,ds:[bx];设置ds:dx指向要显示的字符串的首地址
mov ah,9
int 21h ;调用int 21h的9号功能输出字符串
pop si
pop dx
pop bx
pop ax
ret
;;;;;;;显示字符串子程序结束;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;延时子程序的开始;;;;;;;;;;;;;;;;;;;;;;
delay:
push ax
push dx
mov dx,2000h
mov ax,0
loop_delay:
sub ax,1
sbb dx,0
cmp ax,0
jne loop_delay
cmp dx,0
jne loop_delay
pop dx
pop ax
ret
;;;;;;;;;延时子程序的结束;;;;;;;;;;;;;;;;;;;;;;
codesg ends
end start
- [mywiil] 我没用书上的入栈出栈写,就是先看看不用书上的方法能做出来否? ============== 不错 09/19 09:24
- [njutyangxiao] 谢谢你的指导 09/18 17:00
- [younggay] 嗯,应该说理解的没问题。 09/18 15:41
- [njutyangxiao] 检测点16.1的题目是中是这样定义的: a dw 1,2,3,4,5,6,7,8 b dd 09/16 11:23
- [njutyangxiao] 嗯,谢谢指导 09/16 11:22
- [wsrf] assume伪指令指定了段中标号与相应段寄存器的联系。 09/16 09:46
- [wsrf] 没有问题,不过源代码中 a db 1,2,3,4,5,6,7,8 b dw 0 怎么 09/16 09:43
- [njutyangxiao] 谢谢,keep moving! 09/16 09:06
- [njutyangxiao] 谢谢你的指导 09/16 09:05
- [njutyangxiao] 谢谢你的指导 09/16 09:05