我正在試圖在控制檯上用程序集做一個基本的'遊戲'(輸入/輸出)。由於我是彙編新手,我不太清楚在低級語言中工作的方式:我習慣於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
看起來像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
這是32位:「eax」,而不是「rax」,但是哪個彙編程序和哪個系統 - 如果有的話:Windows? Linux呢?我猜測Windows(不是AT&T語法)。 – turboscrew
使用'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