Не удалось получить argv [0] в сборке x86

Ответ здесь указывает, что ESP + 4 указывает на argv[0]. Но я не могу заставить его работать:

        .section .text

        .globl _start

_start:

        movl 8(%esp), %ebx
        movl $1, %eax
        int $0x80

И теперь, когда я пытаюсь выполнить это:

$ as --32 argv.s -o argv.o
$ ld -m elf_i386 argv.o -o argv
$ ./argv 2
$ echo $?
16

Он отображает 16, хотя я ожидаю здесь 16. Что я делаю неправильно ?

0x10 выглядит разумным значением для младшего байта указателя. Вы получите 0, если нет аргументов, поэтому argv[1] имеет значение NULL, верно? В любом случае, разыменуйте в другой раз, если вы хотите, чтобы байт содержал код символа ASCII из указанной строки. (помните, что статус выхода Linux имеет ширину всего 1 байт.)
Peter Cordes 09.09.2018 05:58

Используйте GDB для пошагового выполнения кода, чтобы вы могли выгружать стековую память более чем на 1 байт за раз и легко просматривать значение указателя + то, на что он указывает.

Peter Cordes 09.09.2018 06:06

@PeterCordes Спасибо, пошаговое выполнение через GDB было полезным.

Sibi 09.09.2018 08:02
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
3
112
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Благодаря комментарию Питера я наконец смог найти ответ. Поскольку argv - это указатель на указатель на char, при первом разыменовании вы получите адрес, который является указателем на символ. Повторное разыменование даст вам желаемый результат:

        .section .text

        .globl _start

_start:

        movl 8(%esp), %ebx
        movl (%ebx), %ebx
        movl $1, %eax
        int $0x80

При его выполнении:

$ ./argv 1
49

49 - ожидаемый результат, который представляет собой Символ ASCII1.

Другие вопросы по теме