史萊姆論壇

返回   史萊姆論壇 > 專業主討論區 > 程式語言討論區
忘記密碼?
論壇說明

歡迎您來到『史萊姆論壇』 ^___^

您目前正以訪客的身份瀏覽本論壇,訪客所擁有的權限將受到限制,您可以瀏覽本論壇大部份的版區與文章,但您將無法參與任何討論或是使用私人訊息與其他會員交流。若您希望擁有完整的使用權限,請註冊成為我們的一份子,註冊的程序十分簡單、快速,而且最重要的是--註冊是完全免費的!

請點擊這裡:『註冊成為我們的一份子!』

Google 提供的廣告


發文 回覆
 
主題工具 顯示模式
舊 2007-05-18, 04:01 PM   #1
k2872869
榮譽勳章

勳章總數
UID -
在線等級:
文章: n/a
精華:
預設 疑問 - 組合語言:要如何延遲

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


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, 收花文章: 0 篇, 收花: 0 次
回覆時引用此帖
舊 2007-05-19, 10:48 AM   #2 (permalink)
管理版主
 
mini 的頭像
榮譽勳章
UID - 4144
在線等級: 級別:96 | 在線時長:9665小時 | 升級還需:132小時級別:96 | 在線時長:9665小時 | 升級還需:132小時級別:96 | 在線時長:9665小時 | 升級還需:132小時級別:96 | 在線時長:9665小時 | 升級還需:132小時級別:96 | 在線時長:9665小時 | 升級還需:132小時級別:96 | 在線時長:9665小時 | 升級還需:132小時
註冊日期: 2002-12-07
文章: 13249
精華: 0
現金: 26241 金幣
資產: 3024051 金幣
預設

一般的延時比如
語法:
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功能
這個我不知如何呼叫 ...
mini 目前離線  
送花文章: 1999, 收花文章: 7957 篇, 收花: 26749 次
回覆時引用此帖
發文 回覆



發表規則
不可以發文
不可以回覆主題
不可以上傳附加檔案
不可以編輯您的文章

論壇啟用 BB 語法
論壇啟用 表情符號
論壇啟用 [IMG] 語法
論壇禁用 HTML 語法
Trackbacks are 禁用
Pingbacks are 禁用
Refbacks are 禁用


所有時間均為台北時間。現在的時間是 04:01 PM


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


SEO by vBSEO 3.6.1