2013-04-03 148 views
-2

有沒有辦法在程序集中暫停1秒鐘,然後讓它恢復正常流程?我通過串口編程聊天,但由於某種原因,當我在其中一個程序上鍵入字符串時,另一個程序並不總是以單個字符串的形式接收它;有時會將其打印爲一個整體,但有時只顯示一個部分,並立即意識到有更多字符串可以接收並將其打印爲第二個字符串。我試圖做的是停止一秒鐘左右的程序,所以它可以確保它收到整個字符串,而不僅僅是它的一部分。暫停組裝程序

+0

如果你做得對,你應該得到一個只有當你收到某種「消息結束」字節(例如換行符)時纔會顯示的字節流,並且你不應該有任何需要一開始就停下來。您的1秒暫停不能解決問題。 – Brendan 2013-04-04 01:39:34

+3

請指定CPU和操作系統。答案將取決於那些。事實上,請爲所有[議會]問題做同樣的事情。 – 2013-04-04 02:24:42

+1

修復您的聊天協議會不會更容易,以便字符串的開始/結束可以在接收爲字節流時被識別?定時器機箱不能可靠工作,或引入令人討厭的延遲,或兩者兼而有之。 – 2013-04-05 12:41:56

回答

2

對於80x86;如果操作系統類似MS-DOS或「無」,那麼在執行HLT(節省電量)時,您需要在循環中輪詢BIOS的「自午夜以來的刻度」。要獲得「自午夜以來的滴答聲」,請使用int 0x1Aah=0x00。一秒鐘將是大約18個滴答聲。如果你不小心,在午夜之前做「expiry_time = now + 1秒」,那麼你可能會永遠等待,你應該做if(expiry_time >= 0x001800B0) expiry_time -= 0x001800B0以防止這種情況發生。如果操作系統是現代的(Windows,OS X,Linux,FreeBSD等),那麼你想告訴操作系統的調度程序在1秒鐘內運行其他任務(以避免無故中斷CPU時間);你要麼找到合適的(特定於操作系統的)API來做到這一點,要麼找到某種類型的庫來鏈接它,這樣做對你來說很重要。

+0

+1(我曾經使用這種技術爲80386製作了紅外發射器。)微秒的分辨率間隔不必擔心溢出。 – 2013-04-04 03:30:36

+0

我試過這個等待1個滴答聲(aprox 55ms),它工作得很好,我的任何字符串都沒有被再次接收 – user2221424 2013-04-04 05:35:22

0

是,

使用GOTO和NOPS。

或者創建一個循環來隱藏nops,並在滿足某些條件時逃脫它。 或創建一個GOTO標籤的NOP

startover 
nop 
nop 
nop 
nop 
nop 
nop 
nop 
nop 
GOTO startover // this wil run forever! you need an escape condition 
+0

是甚至組裝?我從未在 – user2221424 2013-04-04 01:22:13

+1

之前看過這些命令。每個CPU至少有一種彙編語言(並且通常CPU有2種或更多種不同的彙編語言,例如Intel語法與AT&T)。因爲這個問題並沒有說哪個CPU使用哪種彙編語言,「僞彙編」是個好主意。 'GOTO'不是程序集,但'GOTO'以多種語言存在,並且被廣泛理解,這使得它成爲「僞組裝」的有吸引力的選項。 – Brendan 2013-04-04 01:34:49

+0

我不明白的是nop,我想它除了浪費時間外並沒有真正做任何事情。 – user2221424 2013-04-04 05:34:39

0

是的,你可以得到系統時鐘,然後做一個循環來檢查,如果第二個已通過你有時間之後的bunchs ...

這可能會幫助,如果你在x86彙編:https://softwareengineering.stackexchange.com/questions/134084/assembly-instructions-execution-time

或者你可以做一個很長的循環,使暫停......第二個我不建議多,但它可能會滿足您的需求

+0

我正在使用x68,我會嘗試一下,非常感謝 – user2221424 2013-04-04 01:22:53

2

我不回答這個問題本身,但無論如何:

從不(我的意思是NEVER!)使用時間延遲這樣的目標!這是非常非常非常糟糕的設計。串口通信基於字符流。正確設計的程序(不管使用什麼語言)必須處理流,而不需要任何時間延遲。

-1

你可以選擇你想要什麼

.code 
;write your code 
call Waitmsg 
+0

錯誤的問題。這是關於睡眠/等待一段固定的時間,而不是用戶輸入。你已經在http://stackoverflow.com/questions/23249397/assembly-console-pause上發佈了這個確切答案的另一個副本,它屬於哪裏(雖然如果你鏈接到一些關於該功能的文檔會好很多是/一樣)。 – 2016-10-23 21:39:05

0

似乎從緩衝問題就來寫這個聲明.CODE段後顯示。等待可能很好,但是你必須回答「多少次?」的主要問題。事實上,你並不知道。 在ASM中,我們使用中斷或等待「直到標誌被設置」。但只有「等待一定秒數」似乎不是正確的選擇(我同意johnfound 100%!)

建議:在發件人程序中,緩衝數據,直到CR/LF發送它們。在接收器上,等待顯示CR/LF。 也看看串行緩衝區指針(IN和OUT)來查看開始和結束指針的位置,這可能會給出一些信息來解釋發生了什麼。