史萊姆論壇

史萊姆論壇 (http://forum.slime.com.tw/)
-   程式語言討論區 (http://forum.slime.com.tw/f76.html)
-   -   組合語言:要如何延遲 (http://forum.slime.com.tw/thread205756.html)

k2872869 2007-05-18 04:01 PM

組合語言:要如何延遲
 
以下是迴力球 要如何使它執行時能延遲迴力球移動速度 能延遲肉眼的看到即可


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

mini 2007-05-19 10:48 AM

一般的延時比如
語法:

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

不過以上是猜測那些 .inc 有Delay這個副程式 ^^"

最後一種比較低階是利用呼叫 RTC值
接著比較差值
等達到目的時間後就跳出delay功能
這個我不知如何呼叫 ...:on_47:


所有時間均為台北時間。現在的時間是 09:29 PM

Powered by vBulletin® 版本 3.6.8
版權所有 ©2000 - 2025, Jelsoft Enterprises Ltd.

『服務條款』

* 有問題不知道該怎麼解決嗎?請聯絡本站的系統管理員 *


SEO by vBSEO 3.6.1