汇编程序54:实验17 编写包含多个功能子程序的中断例程

 1 1.挖掘有用信息
 2 首先可以得到逻辑扇区号与物理扇区号的算术关系:
 3 
 4 逻辑扇区号=(面号*80+磁道号)*18+扇区号-1
 5 
 6 然后还可以得到与之相关的逆推关系:
 7 
 8 面号=int(逻辑扇区号/1440)
 9 磁道号=int(rem(逻辑扇区号/1440)/18)
10 扇区号=rem(rem(逻辑扇区号/1440)/18)+1
11 
12 最后得到重要的参数说明:
13 
14 (ah)=功能号(0表示读,1表示写)
15 (dx)=逻辑扇区号
16 es:bx指向向扇区读或写的内存区
17 
18 2.分析子程序
19 ah、dx的传入必须在测试程序传入
20 es:bx的传入必须在中断例程当中
21 欲推出逆关系,必进行32位/16位的除法,dx储存高位或余,ax储存低位或商
22 所以得先把相关寄存器入栈,然后获取相应物理扇区号即可
23 
24 3.安装程序如下
25 assume cs:code
26 
27 code segment
28     start:mov ax,cs
29           mov ds,ax
30           mov si,offset s0
31           mov ax,0020h
32           mov es,ax
33           mov di,0
34 
35           mov cx,offset s9-offset s0
36           cld
37           rep movsb
38 
39           mov ax,0
40           mov es,ax
41           mov word ptr es:[7ch*4],0
42           mov word ptr es:[7ch*4+2],0020h
43 
44           mov ax,4c00h
45           int 21h
46 
47        s0:push ax
48           mov ax,0020h
49           mov es,ax
50           mov bx,offset s9-offset s0
51           pop ax
52           
53           mov al,1 ;扇区数
54           push ax
55           push bx
56 
57           mov ax,dx
58           mov dx,0
59           mov bx,1440
60           div bx
61           mov bl,18
62           push ax
63           mov ax,dx
64           pop dx
65           div bl
66           mov ch,al ;求磁道号
67           mov cl,ah ;求扇区号
68           inc cl
69           mov bx,dx
70           mov dh,bl ;求面号
71           mov dl,81h ;求驱动器号
72 
73           pop bx
74           pop ax
75           int 13h
76           iret
77 
78        s9:nop
79 code ends
80 
81 end start
82 
83 4.测试程序如下
84 assume cs:code
85 
86 code segment
87     start:mov ah,1
88           mov dx,1439
89           add ah,2
90           int 7ch
91 
92           mov ax,4c00h
93           int 21h
94 code ends
95 
96 end start

 

posted on 2018-02-11 12:20  叶倾仙  阅读(258)  评论(0编辑  收藏  举报

导航