English Deutsch Français Italiano Español Português 繁體中文 Bahasa Indonesia Tiếng Việt ภาษาไทย
所有分類

就像c語言系統本身有提供delay函數, 只要在delay( ) 指令的引數內輸入 想要延遲的秒數,當程式執行到這delay函數指令時就會讀秒到延遲時間結束,才往下一個指令執行!

我想請問組合語言是否也有提供這樣方便的函數?只要設幾秒,程式就會等待幾秒才往下執行?

2007-11-08 13:28:12 · 3 個解答 · 發問者 eric 7 in 電腦與網際網路 程式設計

樓下的我是在寫螢幕控制的程式 僅使用微處理機 沒使用單晶片,目前是再學組合語言,而書本是純教組合語言怎寫 並沒寫到延遲時間相關的程式

2007-11-08 13:33:43 · update #1

我利用迴圈重覆印出同樣的文字,但我想在螢幕上慢慢印出,所以想在迴圈中加入delay函數來令它慢慢印出,有其它方法嗎?

2007-11-08 13:35:02 · update #2

或是那裡有延遲時間的教學,請告訴我 謝謝@@

2007-11-08 13:35:44 · update #3

是XP作業系統,我的書名:組合語言程式設計,書中介紹8088CPU架構和一堆指令的用法。是屬於初學者剛學組合語言作程式設計而已! 純利用家中PC電腦寫組合語言程式而已,沒使用到單晶片

2007-11-08 17:18:06 · update #4

我發問這問題是因為我有在另一篇發問
http://tw.knowledge.yahoo.com/question/question?qid=1607110706047
是關於螢幕控制的問題,我想利用延遲讓視窗慢慢的上捲開出視窗!

2007-11-09 03:30:41 · update #5

ㄚ旺大大
你的延遲時間的巨集的確可以用,但是我看不太董這延遲程式怎寫的呢@@及為何要作這些指令動作和word ptr [bx]指令及046ch 是作什麼的都不知@@ 請問是否能說明或是延遲時間的程式有教學網站?因為我的書上並沒有寫到這些!

2007-11-09 11:28:53 · update #6

另外請您看一下我的學習目的是否有誤?
學校開這門課是要讓我們了解電腦CPU內部及暫存器、記憶體等架構!然後學會低階語言後再學高階語言速度就會很會,同時學組語後再學單晶片的控制,這樣對學習較有幫助 不是嗎?
小妹我打算弄熟組語 然後才學習 怎利用單晶片來控制!
如果學習方向有誤 ,請麻煩糾正 謝謝唷= =

2007-11-09 11:31:56 · update #7

不好意思^^ 那麼延遲時間的那段程式能解釋一下嗎^^ 謝謝 = =

2007-11-09 16:09:23 · update #8

我那本是2007年 陳俊榮編著 ,全華出版社出的

2007-11-12 01:54:16 · update #9

老師是回答學高、低階語言 誰先並沒先學某個再學某個會較快。因為都只是與電腦溝通的橋梁! 但對學硬體控制的人而言 ,學低階語言能較快了解電腦內部硬體架構,雖然業界很多流行用C寫,但最後仍得將其轉成組譯程式在寫入單晶片,仍建議走硬體控制的話 先學組語讓自已了解架構較好 ,再學C語讓自已寫程式方便。

2007-11-12 02:03:31 · update #10

我有從BIOS提供的INT 1AH查到 AH=01H是設定目前時脈計數 ,時脈計數單位除以 18.2065 即可換算成秒,所以您將將輸入之資料轉換成對應之實際次數 這部份程式我看的懂!

2007-11-12 03:35:16 · update #11

而我現在剩下的疑問是可否請教BIOS 呼叫 INT 1AH,AH=01H 設定目前時脈計數,關於服務程式的用法我不太懂... 我試過程式中連續印字元,而過程中加入了設定 時脈計數 INT 1AH,AH=01H的程式(故意把它的CX,DX 高、低時脈設的很高) 想試著藉由設定時脈計數這個服務程式來作時間延遲。 但設定計數時脈的用處應該不是在這,請問設定計數時脈的次數 會對寫的程式造成什麼差別影響嗎?

2007-11-12 03:41:20 · update #12

我不知寫程式何時才會用到設定計數時脈次數這個服務程式?還有我問老師,他說我們學的是80X86系列的組合語言,但我現在疑問的觀念是 到底是正學習那一棵CPU的組合語言指令集? 我們用的組譯程式是MASM5.X版的,不像6.X版的還可設定要使用那一棵CPU的指令集,若不設,則其預設是8086的指令集。
這是我最後的疑問 想請教您^^
因為我現在學的入門書事實上也與以前出版的入門書內容幾乎根本一樣,前面介紹8088架構,接著介紹其它基礎指令用法及範例而已!
但書上並沒寫使用那棵CPU指令集寫程式

2007-11-12 03:48:20 · update #13

還有cmp ax,word ptr [bx] 這指令與cmp ax,[bx]是一樣的,但
mov [bx],word ptr 0 我修改成mov [bx],0000H , 而LST檔卻說Operand must have size ,我必須給他設size。
請問你這行指令不是指要將[bx]這個有效位址 內含值設為0嗎?

2007-11-12 04:26:22 · update #14

3 個解答

詢問一下...

1.是在X86架構嗎?
2.OS(Operator system)是何種系統,或何種工作環境?

建議你問組合語言時一般都要順帶說明一下,不然會牛頭不對馬嘴.

2007-11-09 01:05:06 補充:
;一共做了三個巨集來完成讀取,印出,延遲等工作
;中間跑一個迴圈
;程式碼如下

CODE SEGMENT
ASSUME CS:CODE,DS:CODE
ORG 100H

; **********************************
; 讀取按鍵回應銀幕
; **********************************
Getchar MACRO char
mov ah,1
int 21h
mov char,al
endM

; **********************************
; 延遲時間 TimeMs=1 >> 1/10 秒
; **********************************
Delay MACRO TimeMs
; 先計算需要時間
pushf
push ds
push cx
push dx

xor ax,ax
xor dx,dx
mov al,TimeMs
mov cx,182
mul cx
mov cx,100
div cx
push ax

; 時間歸0
xor ax,ax
mov ds,ax
mov bx,046ch
mov [bx],word ptr 0

pop ax

; 若超過則離開
testLop:
cmp ax,word ptr [bx]
ja testLop

pop dx
pop cx
pop ds
popf

endM

; **********************************
; 印出一串字
; **********************************
Print MACRO string
mov dx,offset string
mov ah,9
int 21h
endM

BOOT PROC FAR

; **********************************
; 程式從這裡開始
; **********************************
START:
Print mStart

mov cx,15 ; 執行15次
lop:
Delay 10 ; 延遲1秒
Print mStr
loop lop

; 按任意鍵繼續
Print AnyKey
Getchar al
quit:
; 離開程式
mov ah,4ch
int 21h

BOOT ENDP

mStart db 13,10,'Time is start!$'
mStr db 13,10,7,'>>>>>>>$'
AnyKey db 13,10,7,'Press any key 2 continue...$'


SEG_A ENDS


END START


; 執行結果如下

C:\TC>readtime.com

Time is start!
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>>
Press any key 2 continue...
C:\TC>




除此外當然還有別的方式,例如可以直接控制8259A I/O PORT 方式,會更精準些
本方式可以經準到54.94ms 不拘任何快慢電腦都可以使用

;程式碼分段分的很清楚,很容易看的懂
; 順便一提,這年頭學組合語言,且你正在學的是一種快被淘汰的東西,我會建議你,若你真有興趣的話,可以從高階或中階程式語言開始
;希望對你有所幫助

2007-11-09 16:32:53 補充:
若你有在上課,請去問你老師...他若答不出來我在告訴你

若你只是照書在學習練習的話.........

建議先不要學這個,從高階點的程式(ex:VB/C等)開始會比較具應用性.

2007-11-09 23:48:19 補充:
你會有疑問的應該是已下這幾行

 ; 時間歸0
 xor  ax,ax
 mov  ds,ax
 mov  bx,046ch
 mov  [bx],word ptr 0

 pop  ax

 ; 若超過則離開
testLop:
 cmp  ax,word ptr [bx]
 ja  testLop

基本上這是我利用塗改系統記次功能所達成的效果,
在BIOS架構中(不是DOS架構,這兩者先告搞清楚),0000:0000~0000:04ffh為BIOS資料使用區域
其中0~3FFh為系統中斷呼叫位址,0400h~04ffh則為BIOS資料區

2007-11-09 23:48:48 補充:
046ch為BIOS系統INT 1A 呼叫後會在這裡+1而int 1A為真實時間呼叫,每秒會自動產生18.2而此真實時間是由intel8253所產生的....
而int 1A對於BIOS卻是不存在的..........(這部分要把他說清楚只少可以編一本至少100頁以上使用技術手冊,因此無法說的很詳細)

上面程式是借由塗改該區域之資訊並將其歸0後,並將輸入之資料轉換成對應之實際次數,
先乘以182在除以100(也就是18.2次)
mov cx,182
.....
mov cx,100

2007-11-09 23:48:54 補充:
最後在比對是否資料是否大於[46c]
testLop:
 cmp  ax,word ptr [bx]
 ja  testLop

若大於則離開的方式所產生的效果

由於你現在所使用的系統為.386多工保護模式.則該位址會允許被複製出來使用一份
若你是再真實模式下.則該位址會影響到全域

以上看的懂就看.看不懂也別太認真.因為以上資料說明就算是對一個熟X86系統架構的人而言,仍舊要查一大堆 Data shi~~t 才會清楚.由於你希望朝向系統硬體發展.而這些東西你以後自然就會懂.

2007-11-10 01:52:19 補充:
sorry以上
>>最後在比對是否資料是否大於[46c]
>>testLop:
>> cmp  ax,word ptr [bx]
>> ja  testLop
>>
>>若大於則離開的方式所產生的效果
為筆誤!!

修正為
最後在比對是否資料是否"小"於[46c]
若"小"於則離開的方式所產生的效果

2007-11-10 01:59:49 補充:
順便問一下....你那書作者是否是 "蔡文能" 寫的....

2007-11-12 20:03:52 補充:
======================= 分格線 =======================

2007-11-12 20:04:16 補充:
關於:INT 1AH,AH=01H 程式(會)造成什麼差別影響嗎?
AH=1 int 1A 會以CX,DX重設 0000:046c~046f 之值
我在XP保護模式下,執行debug呼叫以上功能,卻產生不出這個效果,一時間找不到開機磁碟片,因此沒有測這個功能,印象中DOS實體模式下一定可以執行.
而這個呼叫等價于

2007-11-12 20:04:49 補充:
push ds
mov CX,0
mov DX,0
xor ax,ax
mov ds,ax
mov bx,046ch
mov [bx],word ptr CX
mov bx,046eh
mov [bx],word ptr DX
pop ds


以x86系統而言,該指令是會向下相容,參閱以下網址
http://zh.wikipedia.org/w/index.php?title=%E4%B8%AD%E5%A4%AE%E5%A4%84%E7%90%86%E5%99%A8&variant=zh-tw

2007-11-12 20:05:07 補充:
你在學的是8086/8088(16Bit)指令而已,而在高一階是使用386指令,在往上(486)...
而你的最終目標是"單晶片",學習組合語言來當成入門,一般都會使用8086/8088(16Bit)指令為入門教材,這並沒有好或壞之間差異,


因為也沒聽說過懂組合語言(包含單晶片)的,就比較會寫程式,而不懂組合語言的,就不知道如何操控單晶片.

只是...給我的感覺就像是,因為要吃豬肉就要學習殺豬拔豬毛等技能,其實效果並不大.因為,進屠宰場一樣可以得到豬肉,你真正需要的只是烹調技術而已.

2007-11-12 20:05:21 補充:
而殺豬拔豬毛等事,就把他當興趣就好了.



>>>mov [bx],word ptr 0 我修改成mov [bx],0000H 之錯誤.

這不難,以你目前的程度,一定想的出來
研究並想出來,你會獲得更多

補語:
很多老師都很喜歡像你這種比較好學好問的學生,建議多花一些時間與你指導老師詢問遇到之困擾與問題.

2007-11-13 00:48:48 補充:
再給你一個提示..
和長度有關

2007-11-08 20:05:06 · answer #1 · answered by ㄚ旺 5 · 0 0

下面網址應該對你有幫助
http://ts777.cc

2014-10-19 04:25:15 · answer #2 · answered by Anonymous · 0 0

就我寫作的經驗是

自訂一個函式

就叫 delay好了

讓他在裡面空轉3億圈再 return

想延遲就call他

2007-11-08 17:33:05 · answer #3 · answered by 呆毛 3 · 0 0

fedest.com, questions and answers