汇编程序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