2013-12-09 238 views
0

我正在試圖在控制檯上用程序集做一個基本的'遊戲'(輸入/輸出)。由於我是彙編新手,我不太清楚在低級語言中工作的方式:我習慣於C++/C#環境。Asm控制檯輸入/輸出

我想要實現的是用戶鍵入他們的名字,並且控制檯輸出它是否與變量myName相同。如果我已經在我的代碼錯誤,我會很感激,如果你能改正

.text 
.global main 

main: 
myName db "Name" 
call readline 
cmp myName, ebx 
je same 
jne notsame 

same: 
mov eax, "We have the same name" 
jmp print 

notsame: 
mov eax, "We have different names" 
jmp print 

readline: 
; read console line 
mov ebx, line ; line is whatever the input is 
ret 

print: 
; do something with eax 

編輯:這將是更好嗎?

.text 
.global main 

main: 
myName db "Name" 
call readline 
pop ebx 
cmp myName, ebx 
je same 
jne notsame 

same: 
push "We have the same name" 
jmp print 

notsame: 
push "We have different names" 
jmp print 

readline: 
; read console line 
push line ; line is whatever the input is 
ret 

print: 
pop eax 
; do something with eax 
+0

看起來像x86/x86-64代碼。代碼可能是無效的,因爲'main:'以'db'名稱開頭('db 0x4e 0x61 0x6d 0x65'),這是32位代碼('echo -n'Name'| udcli -32') dec esi; POPAD; INSD; gs:',並在64位代碼中:('echo -n'Name'| udcli -64')'無效; INSD; GS:'。因此,如果它是x86-64代碼,它會立即崩潰,如果它是32位保護模式操作系統用戶級代碼,那麼它可能沒有執行'insd'的權限。無論如何,你所提出的問題都可以通過Google搜索,無論如何,如果不知道哪個操作系統和哪個彙編程序,就很難幫助你。 – nrz

+0

這是32位:「eax」,而不是「rax」,但是哪個彙編程序和哪個系統 - 如果有的話:Windows? Linux呢?我猜測Windows(不是AT&T語法)。 – turboscrew

+0

使用'eax'並不意味着32位代碼,它在x86-64代碼中也能正常工作。在x86-64代碼中使用32位寄存器作爲dest,將相應的64位寄存器的前32位清零。 'mov eax,「我們有相同的名字」'是無效的代碼,因爲''我們有相同的名字''的大小是21個字節或168位,因此不適合任何32位/ 64位寄存器。我發現沒有其他理由使用AT&T語法,除了1.我不確定GCC擴展程序集的所有功能是否可用英特爾語法和2.遺留代碼。我沒有理由在任何其他Linux x86/x86-64彙編程序中使用AT&T語法。 – nrz

回答

0

這功課嗎?

該代碼是各種關閉。首先,控制檯輸入不是標量 - 它是一個文本字符串。那就是,任意一組字符。你不能指望它適合一個單一的登記冊。您需要聲明一個緩衝區並將其傳遞給控制檯讀取例程,以便將字符放在那裏。其次,爲了比較字符串,你需要按字符來做這個字符 - 字符串不是整數。所以,一個循環將是必要的。閱讀這些。

第三,你真的需要告訴大家你的操作系統是什麼。控制檯I/O的細節將取決於此。在Linux上,它是系統調用。在Windows上,它是Win32 API。

+0

我在Windows上(它不是作業) – user2976089

+0

然後GetStdHandle()然後ReadConsole()。你熟悉Win32 API嗎?你熟悉從裝配中調用它嗎? –

+0

對不起,我會怎麼做? – user2976089