Lassen Sie es mich kurz erklären :).Parameter in der Befehlszeile übergeben, Assembly Programmierung
Ich nähere das Argument 10, indem ich EBP-Register mit ebx-Register verwende, da die Stapelstruktur EBP (Basisregister), Rücksprungadresse, # des Parameters, Parameter 1, Parameter 2 ... seit I don enthält verwende kein lokales Register. Ich konnte sehen, dass der Parameter richtig eingegeben wurde, wie ich es mit Aufruf print_string drucken konnte. Aber, seit < während:> Code-Zeile, es scheint wie der String 10 scheint nicht für die Commend-Zeile gelesen werden tut nichts, wenn es darum geht. Ich würde sanft fragen, wo ich mit dem Code anfangen soll. danke fürs Lesen.
Eingang: ./atoi 10
Ergebnis: 10
%include "asm_io.inc"
segment .data
segment .bss
input resw 1
segment .text
global main
main:
enter 0,0
pusha
mov ebx, [ebp+12]
mov eax, [ebx+4]
; call print_string
dump_stack 1,2,4
mov ebx, 0
mov ecx, 10
while:
cmp al, 0x0a
je print
sub eax, 0x30
mov [input], eax
mov eax, ebx
mul ecx
add eax, [input]
mov ebx, eax
jmp while
print:
mov eax, ebx
call print_int
call print_nl
popa
mov eax, 0
leave
ret
'eax' ist ein Zeiger. Sie müssen 1) dereferenzieren und 2) es erhöhen. Stellen Sie außerdem sicher, dass Sie die korrekten Operandengrößen verwenden (ein Zeichen ist 1 Byte). – Jester
Ersetzen von Eax zu% eax und resw zu resb sind die Lösung, die Sie meinen? – jay
'% eax' ist at & t Syntax und selbst dort wird nicht dereferenziert. Ich habe sogar "Input" vermisst, das ist definiert als ein Wort, das doppelt falsch ist. Yeah 'resb' wäre besser, aber dann kannst du natürlich keine 32 Bits darin speichern. Nicht, dass ich verstehe, warum du das überhaupt brauchst. – Jester