鱼C论坛

 找回密码
 立即注册
查看: 3648|回复: 12

[技术交流] 辛苦4天,终于把课程设计完成,和大家分享一下自己的代码

[复制链接]
发表于 2011-10-19 23:05:52 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 老头子学汇编 于 2011-10-23 15:10 编辑

运行环境1:  XP  (vmware虚拟机),  3.5 软盘, DOS系统没有安装,不知道有没有问题
              2:虚拟机软盘驱动器,连接,随便生成1.fld或1.img格式的文件就可以了
                (这是把3.5软盘连接的,如果没有连接3.5软盘,那就没有效果的)
              3:在虚拟机编译后,直接运行就可以了,不过360报木马,点允许
             4:重启后就可以看到


2.png

1.png



代码如下:
;键盘输入1,2,3,4
;1) reset pc      ;重新启动计算机
;2) start systme  ; 引导现有的操作系统
;3) clock         ; 进入动时钟程序,F1键修改颜色,退出ESC键
;4) set clock     ; 设置时间,退出ESC键,设置时间Enter(回车键)
assume cs:code
code segment                
;===========读取软盘到0:7c00h位置==                   
ReadFloppy:mov ax,0
           mov es,ax
           mov bx,8000h
           mov al,4
           mov ch,0
           mov cl,1
           mov dl,0
           mov dh,0
           mov ah,2
           int 13h
                              
                   mov ax,0
                   mov es,ax
                   mov bx,7c00h
                   mov al,3
                   mov ch,0
                   mov cl,1
                   mov dl,0
                   mov dh,0
                   mov ah,2
                   int 13h
                   mov ax,0
                   push ax
                   mov ax,7e00h
                   push ax
                   retf

          db 1c9h dup (0)
           dw 0aa55h
                  
;==================================

                

     
Experiment17:jmp short Experiment
             
           
;===========数据====================
Menu db "1) reset pc  ",0
     db "2) start system",0
     db "3) clock      ",0
     db "4) set clock  ",0
         db "Input format:"
         db "yy/mm/dd hh:mm:ss",0
     db "Input errors Tip: "
     db "99/12/31 23:59:59",0
;==================================


;===========显示菜单====================
Experiment:mov ax,cs
           mov ds,ax
           mov si,0
                   mov ax,0b800h
                   mov es,ax
                   mov di,160*12+33*2
                   mov bx,0
                   mov cx,4
Exp:       mov al,ds:[si+7e02h]
                   cmp al,0
                   je short Expe
                   mov es:[di+bx],al
                   inc si
                   add bx,2
                   jmp short Exp
Expe:      add si,1
           mov bx,0
           add di,160
                   loop Exp
                   jmp short Keyboard
;=====================================        

                   
                   
;===========键盘输入==============           
Keyboard:mov ah,0
         int 16h
                 cmp al,"1"
                 je short resetpc
                 cmp al,"2"
                 je short  startsystem
                 cmp al,"3"
                 je short Clearthescreen
                 cmp al,"4"
                 je short Clearthescreen
                 jmp short Keyboard  

;================================                 
                 
;============系统重启=============                 
resetpc:mov ax,0ffffh
        push ax
        mov ax,0
        push ax
        retf                
;==================================        


 ;=============引导现在的操作系统=====
 startsystem:mov ax,0
           mov es,ax
           mov bx,7c00h
           mov al,1
           mov ch,0
           mov cl,1
           mov dl,80h
           mov dh,0
           mov ah,2
                   int 13h
            mov ax,0 
            push ax 
            mov ax,7c00h 
            push ax 
            retf 
                
;==========================================

;============清除屏幕========
Clearthescreen:push ax
               push bx
                           push es
                           push cx
                           mov ax,0b800h
                           mov es,ax
                           mov bx,0
                           mov cx,2000
Screen:        mov byte ptr es:[bx]," "
               and byte ptr es:[bx+1],00000111b
                           or byte ptr es:[bx+1],00000111b
                           add bx,2
                           loop short Screen
                           pop  cx
                           pop  es
                           pop  bx
                           pop ax
                           cmp al,"3"
                           je short clock
                           cmp al,"4"
                           je short kaset
                           call  Experiment
kaset:         call setclock
                                


;===========动态时钟@修改颜色=========
clock:push bx
          push es
          mov ax,0b800h
          mov es,ax
          mov bx,0
          mov si,160*12+30*2
          mov bh,0
          mov ah,0
      mov bl,10
      dec bl
xxxx: mov al,bl
          out 70h,al
          in al,71h
          mov ah,al
          mov cl,4
          shr ah,cl
          and al,00001111b
          add ah,30h
          add al,30h

          cmp bl,9
      je short Years
          cmp bl,8
          je short Month
          cmp bl,7
          je short Day
          cmp bl,4
          je short Time
          cmp bl,2
          je short Point
          cmp bl,0
          je short Second
Modify:in al,60h
       cmp al,01
           je short Clearthescreen
          cmp al,3bh
          je short Color
          pop es
          pop bx
          jmp short clock
ssss:jmp short xxxx
aaaa:jmp short Modify
Years:mov es:[si],ah                         ; 年份
          mov es:[si+2],al
          mov byte ptr es:[si+4],"/"
      dec bl
          jmp short ssss
Month:mov es:[si+6],ah                       ;月份
          mov es:[si+8],al
          mov byte ptr es:[si+10],"/"
      dec bl
          jmp short ssss
Day: mov es:[si+12],ah                       ;天数
          mov es:[si+14],al
          mov byte ptr es:[si+16]," "
      dec bl
          sub bl,2
          jmp short ssss
Time: mov es:[si+18],ah                       ;小时
          mov es:[si+20],al
          mov byte ptr es:[si+22],":"
          sub bl,2
          jmp short ssss
Point:mov es:[si+24],ah                     ;分钟
          mov es:[si+26],al
          mov byte ptr es:[si+28],":"
          sub bl,2
          jmp short ssss
Second:mov es:[si+30],ah                   ;秒
          mov es:[si+32],al
          mov byte ptr es:[si+34]," "
          sub bl,2
          jmp short ssss
Color:push bx
      mov bx,160*12+30*2
      mov cx,17
Colos:inc byte ptr es:[bx+1]      
          add bx,2
          loop short Colos
      pop bx
      jmp short aaaa 
 ;================================
 
 

 ;================修改时间============
setclock: mov ax,cs
           mov ds,ax
                   mov si,7e3eh
                   mov ax,0b800h
                   mov es,ax
                   mov di,160*12+25*2
                   mov ch,0
set:       mov cl,ds:[si]
           cmp cl,0
                   je short Cursor
           mov es:[di],cl
           inc si
           add di,2
           jmp short set
Cursor:mov ah,2        ;
       mov bh,0
       mov dh,13
       mov dl,38
input:int 10h
      in al,60h          ;  
      cmp al,01
      je short Quit  
            cmp al,01ch                              
      je short timeEnter
jjjj: push dx              
          cmp al,39h          
          je short zzzz      
          pop dx
          push dx          
          cmp al,0eh
          je short Clear
          pop dx            
wwww: mov ah,0
      int 16h
          cmp al,3ah
          ja short LLLL
          cmp al,1fh
          jnb short show
LLLL:      jmp short input          

Quit:mov ah,2          
     mov bh,0
         mov dx,0
         int 10h
         mov al,0           
         call Clearthescreen  ;清屏
         
zzzz:pop dx                
     mov al," "             
     jmp short wwww 
;------------显示字符------------           
show:push bx
     push dx
     mov ah,9            
     mov bl,7
         mov bh,0
         mov cx,1
         int 10h                         
         mov ah,2         
         pop dx
         pop bx
         inc dl
         cmp dl,56         
      je short Overflow  
         jmp short input    
Overflow:mov ah,9       
         mov al," "
         mov bl,7
         mov bh,0
         mov cx,1       
         int 10h        
         jmp short         Cursor        
                 
 
;---------清楚字符--------------                 
Clear:pop dx         
      mov ah,2       
      mov al,0
      dec dl
          cmp dl,37        
          je short Cursor  
          int 10h        
          mov ah,9
          mov al," "
          mov bl,7
          mov bh,0
          mov cx,1
          int 10h          
      jmp short wwww
;-----------------------------

;----------修改时间-----------
timeEnter:mov ax,0b800h       
                  mov es,ax
                  mov di,160*13+40*2              
          mov al,es:[di]              
          cmp al,"/"                     
          jne short Error1                          
                  mov al,es:[di+2]                
          cmp al,"2"                        
          jnb short Error1

          mov al,es:[di+4]
          cmp al,"3"
          jnb short Error1

                  mov al,es:[di+6]
                  cmp al,"/"                     
          jne short Error1

                  mov al,es:[di+8]
                  cmp al,"4"
           jnb short Error1
                   mov al,es:[di+12]
                  cmp al," "                     
          jne short Error1

                  mov al,es:[di+14]
                  cmp al,"3"                     
          jnb short Error1

                  mov al,es:[di+18]
                  cmp al,":"                     
          jne short Error1
        
                  mov al,es:[di+20]
                  cmp al,"6"                     
          jnb short Error1
                  mov al,es:[di+24]
                  cmp al,":"                     
          jne short Error1
                  mov al,es:[di+26]
                  cmp al,"5"                     
          ja short Error1 
                  jmp short Dateissue
Goback:mov al,0
       call jjjj
Error1:mov ax,cs             
       mov ds,ax       
           mov si,0
           mov ax,0b800h
           mov es,ax
       mov di,20*160+22*2
pppp:  mov al,ds:[si+7e5dh]
       cmp al,0
       je short  Goback
           mov es:[di],al
           mov byte ptr es:[di+1],00000100b
           inc si
           add di,2
           jmp short pppp         
Dateissue:mov al,es:[di+8]        
                   cmp al,"3"              
           jne short  issue   
         mov al,es:[di+10]       
           cmp al,"1"             
           ja short Error1          
                  
issue:          mov al,es:[di+14]
                  cmp al,"2"                    
                  je short TTTT
             jmp short correctinput
TTTT:                  mov al,es:[di+16]           
                  cmp al,"3"                  
          ja short Error1
                   
;------ACSLL码转换BCD码,再修改时间---                                                  
correctinput:mov ax,0b800h
             mov es,ax
                         mov di,160*13+38*2
                         mov bl,9
                         mov cx,3
Writedate:   push cx
              mov ah,es:[di]         
                         mov al,es:[di+2]       
                         sub ah,30h             
                         sub al,30h            
                         mov cl,4
                         shl ah,cl
                         add ah,al
                         mov al,bl
                         out 70h,al
                         mov al,ah
                         out 71h,al
                         add di,6
                         dec bl
                         pop cx
              loop short Writedate
                  
                  
                  
                     mov bl,4
                         mov cx,3
Writedate_1:push cx
             mov ah,es:[di]
                         mov al,es:[di+2]            
                         sub ah,30h                 
                         sub al,30h
                         mov cl,4
                         shl ah,cl
                         add ah,al
                         mov al,bl
                         out 70h,al
                         mov al,ah
                         out 71h,al
                         add di,6
                         sub bl,2
                         pop cx
              loop short Writedate_1

                  
                call Quit
                
start:mov ax,cs
      mov es,ax
      mov bx,offset ReadFloppy                   

        mov al,3                     
        mov ch,0                     
        mov cl,1                    
        mov dl,0                     
        mov dh,0                     
        mov ah,3                    
        int 13h
                 
                mov ax,4c00h
                int 21h
code ends
end start




     


想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-10-19 23:19:20 | 显示全部楼层
你的课程设计做有关汇编的?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 2011-10-19 23:27:21 | 显示全部楼层
本帖最后由 老头子学汇编 于 2011-10-20 01:45 编辑

不懂你说的是什么意思?
这代码就是按照王爽汇编的书做课程设计!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-10-19 23:43:18 | 显示全部楼层
谢谢楼主分享
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-10-20 10:01:36 | 显示全部楼层
看不懂 还没开始学!!!!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-10-20 10:26:56 | 显示全部楼层
赞一个。。:lol
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-10-20 11:10:32 | 显示全部楼层
呵呵,我以为你们的专业课的课程设计做关于汇编的~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-10-21 16:48:33 | 显示全部楼层
写入fld或img代码:

#include <stdio.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/stat.h>

int main(int agrc,char *argv[])
{
        int fd_source;
        int fd_dest;
        int read_count = 0;
        char buffer[512] = { 0 };
        fd_source = open("boot.bin",O_RDONLY);
        if(fd_source < 0)
        {
                perror("open boot.bin error:");
                return 0;
        }
        fd_dest = open("virtual_floppy.vfd",O_WRONLY);
        if(fd_dest < 0)
        {
                perror("open virtual_floppy.vfd error:");
                return 0;
        }
        while((read_count = read(fd_source,buffer,512)) > 0)
        {
                write(fd_dest,buffer,read_count);
                memset(buffer,0,512);
        }
        printf("write image ok!\n");
        return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 2011-10-21 17:05:04 | 显示全部楼层
本帖最后由 老头子学汇编 于 2011-10-21 17:15 编辑
djzxzzm 发表于 2011-10-21 16:21
怎么把代码写到fld或img里?

你误会我的意思了,
虚拟机→移除设备→软盘驱动器→设置→使用软盘镜像文件→浏览,这里新建一个.fld或.img或.iso文件,
随便创建一个.txt文件然后把.txt改成上面3种格式,然后连接
然后代码就在虚拟机里面编译运行,
你打开(我的电脑)看看,除了c盘.d盘.e盘,f盘,h盘,还有没有3.5软盘
如果没有3.5软盘,那就不行了
这代码只在XP系统通过,或dos系统,


想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-10-22 07:37:04 | 显示全部楼层
真是高手,厉害!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 2011-10-22 10:32:35 | 显示全部楼层
徐缘 发表于 2011-10-22 07:37
真是高手,厉害!

朋友别这么说:funk:,我只不过是个垃圾而已,
给别人看到,会笑的!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 2011-10-23 11:36:26 | 显示全部楼层
本帖最后由 老头子学汇编 于 2011-10-23 13:03 编辑
djzxzzm 发表于 2011-10-23 08:34
随便创建一个.txt文件然后把.txt改成上面3种格式,然后连接
然后代码就在虚拟机里面编译运行,
??

创建一个文件是要你虚拟机软盘驱动器连接,
---------------------------------------------------------
代码在虚拟机用编译器masn5 或6.15编译。在虚拟机里运行!
可能是我表达能力不好,我发我QQ号给你!加好友说吧
---------------
是把软盘X道X面X扇门的内容读取到0:7c00,再把CS:IP指向0:7c00,就可以执行引导程序
-----------------------
如果在0号软盘中没有软盘,
( 为了不出现这情况,就要"虚拟机 软盘驱动器"连接,那就是生成.flp格式连接,如果你不连接的,那就写入不了软盘)

如果没有软盘,就读取C盘0道0面1扇门的内容到0:7c00,再把CS:IP指向0:7c00,执行原来的系统启动程序
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-10-29 18:09:35 | 显示全部楼层
LZ太强大了。。。。。。。。。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-10-8 19:48

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表