汇编网首页登录博客注册
chinatree的学习博客
博客首页博客互动【做检测题】论坛求助

我的博客

个人首页 |  我的文章 |  我的相册 |  我的好友 |  最新访客 |  文章收藏 |  论坛提问 |  友情链接 |  给我留言  
图片载入中
学习动态
友情链接

[2011-09-06 00:04] 第17章检测点及实验17

图片载入中
检测点 17·1
“在int 16h中断中,一定有设置if=1的指令。”这种说法对吗?
答:对的,因为int 9是可屏蔽中断,如果被屏蔽掉的话,在键盘缓冲区就没有可读取的字符了,而且在用户调用int 16h时cpu会将if和tf置0。


安装一个新的int 7ch中断例程,实现通过逻辑扇区号对软盘进行读写。
  参数说明:
  (1)用ah寄存器传递功能号:0表示读,1表示写;
  (2)用dx寄存器传递要读写的扇区的逻辑扇区号;
  (3)用es:bx指向存储读出数据或写入数据的内存区。
  提示,用逻辑扇区号计算出面号、磁道号、扇区号后,调用int 13h中断例程进行实
际的读写。

stack segment
db 32 dup (0)
stack ends
code segment
assume cs:code,ds:code,ss:stack
start:mov ax,stack
mov ss,ax
push cs
pop ds
xor ax,ax
mov es,ax
mov di,200h
mov si,offset int7c
mov cx,offset intend-offset int7c
cld
rep movsb
mov word ptr es:[7ch*4],200h;设置入口地址
mov word ptr es:[7ch*4+2],0
mov ax,0b800h
mov es,ax
xor di,di
mov cx,4000
xor ax,ax
mov ds,ax
xor si,si
rep movsb 
xor bx,bx           ;es:bx指向要存的内存区
mov ah,1            ;是写
mov dx,1234       ;逻辑扇区号
int 7ch
mov ax,4c00h
int 21h
int7c:push cx
push ax
mov ax,dx
xor dx,dx
mov cx,1440      ;看下是0面还是1面
div cx
push ax       ;商后面用
mov ax,dx     
mov cl,18      ;余数除以18得到磁道号
div cl
inc ah
mov cl,ah     ;余数+1是扇区
mov ch,al      ;商是磁道
pop ax
mov dh,al    ;这里是面号,因为只有0,1两种状态
xor dl,dl     ;操作的是a盘
pop ax
add ah,2     ;int 13h的功能号是2是读,3是写,所以要加2
mov al,1     ;要操作的扇区数
int 13h
pop cx
iret
intend:nop
code ends
end start


面号=int(逻辑扇区号/1440)
磁道号=int(rem(逻辑扇区号/1440)/18)
扇区号=rem(rem(逻辑扇区号/1440)/18)+1
这是书的公式,int是商,rem是余数
图中ah=0表示操作成功。是在虚拟机中操作的。
评论次数(1)  |  浏览次数(342)  |  类型(汇编作业) |  收藏此文  | 

[  tomato   发表于  2011-09-06 09:03  ]

可装虚拟软驱进行验证。比如,将字符写到软盘上,然后,读到屏幕中是否正确。

 
 请输入验证码  (提示:点击验证码输入框,以获取验证码