assembly-Sprache, die Hilfe bei der Suche nach agrv[1][0]
Ich versuche, das erste element von dem, was gespeichert ist in argv[1]
in x86-Assembler.
Ich knallte den Stapel zweimal, um eax
zunächst, weil ich will argc
so kann ich die Anzahl der argc
. Dann knallte argv
zu ebx
. Im denken zu setzen [ebx]
in bl
. Von hier aus bin ich verloren. Ich habe wenig oder keine Erfahrung in der Montage, ich bin gerade auf der Suche, um es zu verstehen.
main:
;
mov ecx, 0 ;count output characters
pop eax ;reject this 32 bits
pop eax ;get argc
;
pop ebx ; get argv
;mov bl, [ebx]
;
add al, 30H ;convert integer to ascii
mov edi, cline ;put char in output buffer
mov byte [edi],al
;inc edi
;mov [edi], bl
inc ecx ;increment output char count
inc edi ;increment pointer to o/p buffer
mov al, 0aH ;LF to end line
mov byte[edi],al ;put it at end of output line
inc ecx ;increment output char count
push ecx ;save char count on stack
mov edx,len ;length of string to write
mov ecx,msg ;addr of string
mov ebx,1 ;file descriptor 1 = stdout
mov eax,4 ;"write" system call
int 0x80 ;call the kernel
;
pop edx ;restore char count into edx for system call
mov ecx,cline ;address of string
mov ebx,1 ;file descriptor 1 = stdout
- Vergessen Sie nicht die code Blöcke bitte. Ich befestigt es für Sie.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Werfen Sie einen Blick hier: NASM - Linux Erste Befehl Linie Parameter
Hier ist, wie es funktioniert:
Wo ARG_NUMBER ist eine 1-basierte index in argv
Werde ich die Verwendung von printf aus der C-Bibliothek, um es deutlicher zu formulieren:
Ist es kein Fehler, überprüfen Sie hier, um es einfach zu halten. Sie könnten überprüfen, um zu sehen, ob die Anzahl der Argumente über das hinausgeht, was Sie erwarten oder was auch immer.
@Ed Cashin, wenn die OP ist, zu lernen, INTEL-syntax, warum verwirren Sie Sie mit AT&T?
[esp + 4 + 4 * ARG_INDEX]
, so dass Sie nicht zu verwirren haben, um mit 1-basierende Nummerierung. Dann alles stimmt mit C, woargv[1]
ist das erste argument nach dem Programmnamen.Ich habe drei Empfehlungen:
Für immer argv, kann ich einfach den ASCII-code für das erste Zeichen in argv[1] von meinem Programm zu vermeiden, das system nennen. Der system call ist ein anderes problem, als sich argv, so vermeidet es konzentriert sich die Aufmerksamkeit auf das problem zur hand.
Dann kann ich kompilieren eine minimale C-Programm und untersuchen Sie den generierten assembly. Lesen AT&T syntax Assembler ist nicht schlecht, wenn Sie daran denken, dass wenn Sie gehen zu AT&T, die ist in New Jersey, das Ziel liegt auf der rechten Seite der USA 😉
Das Programm gibt den ASCII-code für das erste Zeichen in argv[1]. Die 't' 116.
Prüfung der generierten assembly, sehe ich, dass es nicht knallt, sondern nur Belastungen-Register basierend auf der position des stack-Parameter relativ zum base pointer, ebp. Ich finde, ich mag diese Art der Verwendung von mov mit den base pointer.
Ich kein pop die Art und Weise, die Sie versuchen zu tun, so könnte jemand anderes äußern, wie es zu tun mit pop.
Hab ich kommentierte der Montage ein wenig mit Kommentaren über das, was ich denke, ist Los. Korrekturen sind willkommen.
Habe ich nicht nasm praktisch auf einem 32-bit-Maschine, und die x86_64-Aufrufkonventionen sind nicht die gleichen wie die, die Sie zu tun, so dass ich nicht übersetzen, diese Versammlung in nasm-syntax.