老头子学汇编 发表于 2011-10-19 23:05:52

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

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

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








代码如下:
;键盘输入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:
                   cmp al,0
                   je short Expe
                   mov es:,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 shortstartsystem
               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:," "
               and byte ptr es:,00000111b
                           or byte ptr es:,00000111b
                           add bx,2
                           loop short Screen
                           popcx
                           popes
                           popbx
                           pop ax
                           cmp al,"3"
                           je short clock
                           cmp al,"4"
                           je short kaset
                           callExperiment
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:,ah                         ; 年份
          mov es:,al
          mov byte ptr es:,"/"
      dec bl
          jmp short ssss
Month:mov es:,ah                     ;月份
          mov es:,al
          mov byte ptr es:,"/"
      dec bl
          jmp short ssss
Day: mov es:,ah                     ;天数
          mov es:,al
          mov byte ptr es:," "
      dec bl
          sub bl,2
          jmp short ssss
Time: mov es:,ah                     ;小时
          mov es:,al
          mov byte ptr es:,":"
          sub bl,2
          jmp short ssss
Point:mov es:,ah                     ;分钟
          mov es:,al
          mov byte ptr es:,":"
          sub bl,2
          jmp short ssss
Second:mov es:,ah                   ;秒
          mov es:,al
          mov byte ptr es:," "
          sub bl,2
          jmp short ssss
Color:push bx
      mov bx,160*12+30*2
      mov cx,17
Colos:inc byte ptr es:      
          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:
         cmp cl,0
                   je short Cursor
         mov es:,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:            
          cmp al,"/"                     
          jne short Error1                        
                  mov al,es:               
          cmp al,"2"                        
          jnb short Error1

          mov al,es:
          cmp al,"3"
          jnb short Error1

                  mov al,es:
                  cmp al,"/"                     
          jne short Error1

                  mov al,es:
                  cmp al,"4"
         jnb short Error1
                   mov al,es:
                  cmp al," "                     
          jne short Error1

                  mov al,es:
                  cmp al,"3"                     
          jnb short Error1

                  mov al,es:
                  cmp al,":"                     
          jne short Error1
      
                  mov al,es:
                  cmp al,"6"                     
          jnb short Error1
                  mov al,es:
                  cmp al,":"                     
          jne short Error1
                  mov al,es:
                  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:
       cmp al,0
       je shortGoback
         mov es:,al
         mov byte ptr es:,00000100b
         inc si
         add di,2
         jmp short pppp         
Dateissue:mov al,es:      
                   cmp al,"3"            
         jne shortissue   
         mov al,es:      
         cmp al,"1"            
         ja short Error1         
                  
issue:          mov al,es:
                  cmp al,"2"                  
                  je short TTTT
             jmp short correctinput
TTTT:                  mov al,es:         
                  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:         
                         mov al,es:      
                         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:
                         mov al,es:            
                         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




   


zyp2011_mit 发表于 2011-10-19 23:19:20

你的课程设计做有关汇编的?

老头子学汇编 发表于 2011-10-19 23:27:21

本帖最后由 老头子学汇编 于 2011-10-20 01:45 编辑

zyp2011_mit 发表于 2011-10-19 23:19 static/image/common/back.gif
你的课程设计做有关汇编的?
不懂你说的是什么意思?
这代码就是按照王爽汇编的书做课程设计!

crazylinux 发表于 2011-10-19 23:43:18

谢谢楼主分享

jackfong 发表于 2011-10-20 10:01:36

看不懂 还没开始学!!!!

tsembrace 发表于 2011-10-20 10:26:56

赞一个。。:lol

zyp2011_mit 发表于 2011-10-20 11:10:32

呵呵,我以为你们的专业课的课程设计做关于汇编的~

cyousui 发表于 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 = { 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;
}

老头子学汇编 发表于 2011-10-21 17:05:04

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

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


徐缘 发表于 2011-10-22 07:37:04

真是高手,厉害!

老头子学汇编 发表于 2011-10-22 10:32:35

徐缘 发表于 2011-10-22 07:37 static/image/common/back.gif
真是高手,厉害!

朋友别这么说:funk:,我只不过是个垃圾而已,
给别人看到,会笑的!

老头子学汇编 发表于 2011-10-23 11:36:26

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

djzxzzm 发表于 2011-10-23 08:34 static/image/common/back.gif
随便创建一个.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,执行原来的系统启动程序

Goalgun 发表于 2011-10-29 18:09:35

LZ太强大了。。。。。。。。。。。
页: [1]
查看完整版本: 辛苦4天,终于把课程设计完成,和大家分享一下自己的代码