2012-07-18 53 views
0

我想知道如何從組裝鍵盤中讀取整數。我正在使用Linux/x86 IA-32架構和GCC/GAS(GNU彙編程序)。我迄今發現的例子是NASM或其他Windows/DOS相關的編譯器。我聽說它與「int 16h」中斷有關,但我不知道它是如何工作的(它是否需要參數?結果發送到%eax或其任何虛擬寄存器[AX, AH,AL]?)。從組裝鍵盤讀取整數(Linux IA-32 x86 gcc gas)

在此先感謝, Flayshon。

:d

+1

其實這取決於環境,即操作系統。 GAS和NASM(以及其他)之間的主要區別在於AT&T與Intel的語法,它們主要是交換源/目的地的位置,以及其他語法元素的一些差異。儘管如此,其中一個人通常仍然可以被另一個知識淵博的人理解。 – 0xC0000022L 2012-07-18 13:42:28

+2

你幾乎肯定不會使用INT 16h來與Linux進行接口...... – 2012-07-18 15:30:41

+0

你爲什麼要在程序集中編碼?您是否熟練使用Posix/Unix/Linux應用程序級系統編程(即大多數系統調用)? – 2012-07-18 20:28:52

回答

2

答案很簡單,你不從鍵盤讀取整數,你從鍵盤讀取字符。您不會在屏幕上打印整數,或者 - 打印字符。你將需要例程來轉換「ascii-to-integer」和「integer-to-ascii」。您可以「只需調用scanf」,然後「爲另一個調用printf」即可。如果用戶行爲良好並將輸入限制在代表十進制數字的字符中,「scanf」可以正常工作,但很難擺脫輸入的任何「垃圾」! 「printf」並不算太壞。儘管我是Nasm用戶(它對Linux非常適用 - 不是「Windows/dos相關」),但我可能會在(G)中使用例程作爲語法。如果你找不到,我會看看我能不能找到他們。正如Brian指出的那樣,int 16h是一個BIOS中斷--16位代碼 - 並且在Linux中沒有用處。

最佳, 弗蘭克

+0

請注意,如果程序集調用'scanf'和'printf',它需要鏈接到'libc',這可能是一個沉重的負擔。 – 2012-07-19 05:20:46

0

在2012年,我不建議編碼裝配的整個程序。只編碼最關鍵的部分(如果您絕對需要某些彙編代碼)。編譯器比人類優化得更好。因此,使用CC++適用於低級別軟件,以及更高級別的語言,例如代替Ocaml

在Linux上,您需要了解linux kernelsystem calls的作用,它們記錄在section 2 of man pages中。你可能需要至少read(2)write(2)(如果只處理標準輸入標準輸出應該已經由父進程打開,例如一個shell),你可能需要許多其他系統調用(例如open(2)close(2))。不要忘記做你的緩衝(爲了效率的目的)。

我強烈建議您通過閱讀一本好書如Advanced Unix Programming來學習Linux系統界面。

系統調用在彙編中的機器級別如何完成在Linux Assembly Howto(至少對於32位的x86 Linux)中有記錄。

0

如果您的目標是「獲得」一個程序,我完全同意Basile。如果你的目標是「學習彙編語言」,這些其他語言不會真的幫助。如果您的目標是要了解硬件的細節,您可能需要彙編語言,但Linux(或任何其他「受保護模式」操作系統)將我們與硬件隔離開來,因此您可能需要使用笨重的舊DOS或甚至「編寫你自己的操作系統」。 Flayshon實際上並沒有說明他的目標是什麼,但是因爲他在這裏問,他可能對彙編語言感興趣......

我們中的一些人患有精神疾病,這讓我們認爲使用匯編語言寫作「很有趣」。幽默我們!

最佳, 弗蘭克

+0

你可以通過使用'asm'編寫幾個例程,甚至是C語言中的代碼塊來學習彙編。您無需編寫完整的自包含程序來學習裝配。 – 2012-07-20 09:32:46