2016-06-05 15 views
3

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 
+0

'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

+0

Ersetzen von Eax zu% eax und resw zu resb sind die Lösung, die Sie meinen? – jay

+1

'% 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

Antwort

2

Ihre während Schleife liest keine Zeichen! Sie rufen diese unter Verwendung von mov dl,[eax] ab.
Wie Sie aus dem folgenden Code sehen können, ist es nicht notwendig, einen Eingang variabel zu verwenden.

xor ebx, ebx   ;Result 
while: 
    movzx edx, byte ptr [eax] ;Read 1 character 
    test dl, dl    ;Test for end of string 
    jz print    ;End found 
    sub dl, 0x30   ;Go from character to value [0,9] 
    imul ebx, 10    ;Result x10 
    add ebx, edx   ;Add new digit 
    inc eax     ;To next character 
    jmp while 
+0

xor ebx, ebx; Ergebnis – jay

+0

Entschuldigung, Bruder, ich verstehe es nicht, kannst du etwas mehr erklären? BTW Dieser Code funktioniert nicht – jay

+0

'xor ebx, ebx' soll das' EBX' Register löschen. Genau wie 'mov ebx, 0 'tut, aber die Anweisung ist besser. –