|
論壇說明 |
歡迎您來到『史萊姆論壇』 ^___^ 您目前正以訪客的身份瀏覽本論壇,訪客所擁有的權限將受到限制,您可以瀏覽本論壇大部份的版區與文章,但您將無法參與任何討論或是使用私人訊息與其他會員交流。若您希望擁有完整的使用權限,請註冊成為我們的一份子,註冊的程序十分簡單、快速,而且最重要的是--註冊是完全免費的! 請點擊這裡:『註冊成為我們的一份子!』 |
|
主題工具 | 顯示模式 |
2007-05-18, 04:01 PM | #1 |
|
疑問 - 組合語言:要如何延遲
以下是迴力球 要如何使它執行時能延遲迴力球移動速度 能延遲肉眼的看到即可
include bios.h include dos.h .model small .data x db 2 y db 3 delta_x db 1 delta_y db 1 top db 201,78 dup (205),187,'$' bottom db 200,78 dup (205),188,'$' vline db 186,78 dup (' '),186,'$' .code begin: mov ax,@data mov ds,ax xor ax,ax print top mov cx,22 l0: print vline loop l0 print bottom l1: write_char 32,1 set_cursor y,x write_char 09,1 checkx: cmp x,1 je rev_x cmp x,78 je rev_x checky: cmp y,1 je rev_y cmp y,22 je rev_y addxy: mov al,delta_x add x,al mov al,delta_y add y,al delay delay: mov cx,3fffh delay1: loop delay1 getc jnz exit jmp l1 rev_x: neg delta_x jmp checky rev_y: neg delta_y jmp addxy exit: end_process .stack end begin ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 以下是dos.h檔的內容 ;************************************************* ;*DOS FUNCTION CALL 01h:讀取按鍵並回映至螢幕上 * ;*傳回: (char)=(AL)=鍵入字元之 ASCII 碼 * ;************************************************* GETCHAR MACRO char mov ah,01h int 21h mov char,al ENDM ;*************************************************** ;* DOS FUNCTION CALL 02h:印字至螢幕 * ;*************************************************** PUTCHAR MACRO char mov dl,char mov ah,02h int 21h ENDM ;*************************************************** ;*DOS FUNCTION CALL 06h:讀取按鍵不回映不等候 * ;*傳回: ZF=0 (AL)=鍵入字鍵之 ASCII 碼, ZF=1 無按鍵 * ;*************************************************** GETC MACRO mov dl,0ffh mov ah,06h int 21h ENDM ;*************************************************** ;* DOS FUNCTION CALL 09h 在螢幕上顯示一字串 * ;*************************************************** PRINT MACRO string mov dx,OFFSET string mov ah,09h int 21h ENDM ;*************************************************** ;* DOS FUNCTION CALL 0Ah 讀取一字串 * ;*************************************************** INPUT MACRO string mov dx,OFFSET string mov ah,0ah int 21h ENDM ;************************************************* ;* DOS FUNCTION CALL 4Ch: 結束程式 * ;************************************************* END_PROCESS MACRO mov ah,4ch int 21h ENDM ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 以下是BIOS.h檔內容 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;************************************************* ;* 有用的 BIOS 巨集 * ;************************************************* ;************************************************* ;*INT 10h (AH)=02:設定游標位置 * ;* (DH)=游標列數,範圍在 0-24 之間. * ;* (DL)=游標行數,範圍在 0-79 之間. * ;* (BX)=頁數. * ;************************************************* SET_CURSOR MACRO row,col mov dh,row mov dl,col mov bx,0 mov ah,2 int 10h ENDM ;************************************************* ;*INT 10h (AH)=09:由目前游標位置重複顯示一樣的字 * ;* (AL)=字的 ASCII 碼 * ;* (BL)=字的屬性 * ;* (CX)=字數 * ;************************************************* WRITE_CHAR_ATTR MACRO char,attr,count mov al,char mov bl,attr mov cx,count mov bh,0 mov ah,09h int 10h ENDM ;************************************************* ;*INT 10h (AH)=0A:顯示 cx 個字元,屬性不變 * ;* (AL)=字的 ASCII 碼 * ;* (CX)=字數 * ;************************************************* WRITE_CHAR MACRO char,count mov al,char mov cx,count mov bx,0 mov ah,0ah int 10h ENDM ;************************************************* ;* INT 10h (AH)=0E:在目前游標位置上顯示一字元 * ;* (AL)=字元的 ASCII 碼 * ;************************************************* TELETYPE_OUT MACRO char mov al,char mov bx,0 mov ah,0eh int 10h ENDM ;************************************************* ;*INT 16h (AH)=0:讀入下一個鍵 * ;*傳回: (AL)=該鍵的 ASCII 碼 * ;* (AH)=該鍵的 SCAN 碼 * ;************************************************* KEYBOARD_IO MACRO mov ah,0 int 16h ENDM 此帖於 2007-05-18 09:35 PM 被 k2872869 編輯. |
送花文章: 0,
|
2007-05-19, 10:48 AM | #2 (permalink) |
管理版主
|
一般的延時比如
語法:
CALL DELAY ;呼叫延遲 ... ;=================================== DELAY: ;延時副程式 PUSH CX MOV CX,0FFH DELAY1: DEC CX CMP CX,0 JNE DELAY1 POP CX RET 就再設一個外圍迴圈 另外一種是include MASM寫好的程式直接呼叫引用 比如 語法:
.386 .MODEL FLAT,STDCALL include windows.inc include user32.inc Include kernel32.inc Include gdi32.inc ... ;===暫停程式的執行狀態=== mov eax , 1000 ; 設定延時1秒 call Delay 最後一種比較低階是利用呼叫 RTC值 接著比較差值 等達到目的時間後就跳出delay功能 這個我不知如何呼叫 ... |
送花文章: 2013,
|