Печать переменной в командную строку с использованием сборки в Linux

Пытаюсь собрать линукс и столкнулся со следующей проблемой. Я только начинаю, поэтому моя программа относительно проста и основана на некоторых примерах, которые я нашел на linuxassembly. Он принимает первый аргумент, переданный в командную строку, и распечатывает его. Вот что у меня пока...

section .bss
    test_string: resb 3

section .text
    global _start

_start:
    pop ebx     ;argument number
    pop ebx     ;program name
    pop ebx     ;first argument
    mov [test_string],ebx

    mov eax,4
    mov ebx,1
    mov ecx,test_string
    mov edx,3
    int 80h

    mov eax,1
    mov ebx,0
    int 80h

Я знаю, что это плохо написано, но, поскольку я новичок в этом, я просто хочу лучше понять, как работают инструкции/переменные сборки, прежде чем двигаться дальше. Я собираю и связываю с помощью...

nasm -f elf first.asm
ld -m elf_i386 -s -o first first.o

Затем я бегу, используя..

./first one two

Я думал, что он напечатает one, но он выводит тарабарщину вроде Y*&. Что я делаю не так? Мой test_string не того типа?


person b10hazard    schedule 05.10.2012    source источник


Ответы (1)


Вы пытаетесь распечатать значение указателя на строку вместо того, чтобы печатать строку. Вместо этого вы хотите сделать это.

pop ebx     ;argument number
pop ebx     ;program name
pop ebx     ;pointer to the first argument

mov ecx,ebx ;load the pointer into ecx for the write system call

mov eax,4   ;load the other registers for the write system call
mov ebx,1
mov edx,3
int 80h

mov eax,1
mov ebx,0
int 80h
person Dirk Holsopple    schedule 05.10.2012
comment
Ах я вижу. Я загружал указатель на test_string. Так что вместо этого я должен был сделать mov ecx, [test_string] - person b10hazard; 06.10.2012
comment
Почему pop ebx только для mov ecx, ebx? Я думаю, вы можете pop ecx и устранить mov ecx,ebx. - person ; 19.12.2015