无系统 nasm汇编贪吃蛇demo草稿

来源:互联网 发布:生有涯而知无涯意思 编辑:程序博客网 时间:2024/05/16 15:57

开发系统centos 6.5 64位,利用系统时钟中断和键盘中断

源码文件snake.s

org 7c00hglobal startstart:    jmp entry#    db 0x00#    db "helloOSX"#    dw  512#    db  1#    dw  1#    db  2#    dw  224#    dw  2880#    db  0xf0#    dw  9#    dw  18#    dw  2#    dd  0#    dd  2880#    db  0,0,0x29#    dd  0xffffffff#    db  "myosudisk  "#    db  "fat12   "#    times 18 db 0keyboard_interrupt:      in  al,0x60    and al,0x80mov ah,alcmp ah,byte [forbiden]jz keyboard_interrupt_exit cmp ah,0x50jz gotkeycmp ah,0x4bjz gotkeycmp ah,0x4djz gotkeycmp ah,0x48jnz keyboard_interrupt_exitgotkey:mov byte[dir],ahkeyboard_interrupt_exit:iret handler:nopmov al,byte [counter]inc almov byte [counter],alcmp al,10jnz handler_exitmov al,0mov byte [counter],alpremove:mov bx,word [snake]mov ah,byte [dir]cmp ah,0x48jz upcmp ah,0x50jz downcmp ah,0x4bjz leftcmp ah,0x4djz rightjmp move  up:mov byte [forbiden],0x50dec bhjmp movedown:mov byte [forbiden],0x48incbhjmp moveleft:mov byte [forbiden],0x4ddec bljmp moveright:mov byte [forbiden],0x4binc blmove:call deadcheckmov di,snakeadd di,word [snakelen]add di,word [snakelen]sub di,2moveloop:sub di,2mov ax,word [es:di]add di,2mov word [es:di],axsub di,2cmp di,snakejnz moveloopmov word [snake],bxcall clearcall putsnakehandler_exit:mov al,20hout 20h,aliretsetuptimer:mov ax,0 ;在8*4内存地址处注册中断处理程序的入口地址mov ds,axmov bx,32mov word [bx],handler-$$mov word [bx+2],07c0hint 8h;mov bx,36;mov word [bx],keyboard_interrupt-$$;mov word [bx+2],keyboard_interrupt-$$;int 8hstiretentry:nopmov ax,csmov es,ax; set video modemov ah,0mov al,3int 10hcall clearcall gamestartcall getcharcall clearcall putsnakecall setuptimerloop:jmp $putchar:push bpmov bp,sppush axpush bxpush cxpush dxmov AH,02hmov BH,0hmov dx,[bp+4]int 10hmov AH,09hmov AL,03hmov BH,0;mov BL,77hmov bx,13mov bh,0mov CX,1int 10hpop dxpop cxpop bxpop axmov sp,bppop bpretputsnake:push axpush cxpush dimov cx,word [snakelen]mov di,snakeputloop:mov ax,[es:di]push axcall putcharadd sp,2add di,2dec cxjnz putlooppop dipop cxpop axretgetchar:    mov ah, 1      int 16h      jz getchar_clear_read ; ///< 键盘缓冲区都空了, 可以转"读键盘输入"        mov ah, 0      int 16h      jmp getchar ; ///< 继续清键盘缓冲区    getchar_clear_read:       mov ah, 1      int 16h      jz getchar_clear_read ; ///< 如果没有键盘输入,继续死等键盘输入        mov ah, 0 ; ///< al是键盘输入      int 16h      ret clear:push axpush bxpush cxpush dxmov bh,7mov ah,6mov al,0mov ch,0mov cl,0mov dh,24mov dl,79int 10hpop dxpop cxpop bxpop axretgamestart:mov si,bpmov bp,startstr;es:bp 指向的内容就是我们要显示的字符串地址了mov cx,word [startlen];显示的字符串长度mov dh,12;显示的行号mov dl,36;显示的列号mov bh,0;显示的页数mov al,1;显示的是串结构mov bl,0ch;显示的字符属性mov ah,13h;明确调用13h子程序int 10hmov bp,siretgameover:mov bp,endstr;es:bp 指向的内容就是我们要显示的字符串地址了mov cx,word [endlen];显示的字符串长度mov dh,12;显示的行号mov dl,36;显示的列号mov bh,0;显示的页数mov al,1;显示的是串结构mov bl,0ch;显示的字符属性mov ah,13h;明确调用13h子程序int 10hjmp $deadcheck:cmp bl,79JG gameovercmp bh,24jg gameovercmp bl,0jz gameovercmp bh,0jz gameoverretcounter: db 0dir:db 0x4dforbiden: db 0x4bstartstr: db "press s to start"startlen: dw $-startstrendstr: db"Game Over!"endlen dw$-endstrsnake: dw 0509h,0508h,0507h,0506h,0505hsnakelen: dw 5 times 510-($-$$) db 0dw 0xaa55


makefile

all:nasm -o snake.o snake.sdd if=./snake.o of=snake.img bs=512 count=1dd if=/dev/zero of=snake.img seek=1 count=2879sz snake.imglinux:nasm -f elf64 -g -F stabs -o snake.o snake.s -l snake.lld -o snake snake.oclean:rm -f *.o *.img



0 0