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

我的博客

个人首页 |  我的文章 |  我的相册 |  我的好友 |  最新访客 |  文章收藏 |  论坛提问 |  友情链接 |  给我留言  
图片载入中
  •  原泉混混,不舍昼夜。盈科而后进,放乎四海,有本着如是,是之取尔!
  • 『姓名』:杨逍
  • 『性别』:男『发送消息
  • 个人说明:
  • 详细信息『加为好友』
学习动态
最新留言

[2009-09-21 00:43] 实验17初稿

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
评论次数(1)  |  浏览次数(701)  |  类型(Assembly's Road) |  收藏此文  | 
 
 请输入验证码  (提示:点击验证码输入框,以获取验证码