странная ошибка сборки с участием работающей, но неверной программы - PullRequest
1 голос
/ 26 мая 2011
GNU nano 2.2.4               File: argv.s                                     

.section .text

    .globl _start

_start:

    movl    %esp, %ebp

    movl    8(%ebp),%ecx
    movl    $4,%edx
    movl    $1,%ebx
    movl    $4,%eax
    int $0x80

    movl    $1,%eax
    movl    $0,%ebx
    int $0x80

позвольте мне предвосхитить этот вопрос, сказав, что я (очевидно) новичок в asm, и любые случайные общие советы, не относящиеся к теме, приветствуются ... Я просто хотел прочитать в argvтерминал bash и распечатайте его обратно.Это было предназначено для проверки того, чтобы я действительно знал, как принимать аргументы.Если я введу целое число, например 2. Программа напечатает 2O.заглавная буква «о», а не ноль.почему?

1 Ответ

2 голосов
/ 26 мая 2011

Вы должны понимать, что argv [1] - это не целое число , как вы хотели бы, но строка заканчивается нулем вместо этого! Строка - это последовательность байтов, заканчивающаяся '\0'.

Это означает, что при передаче символа 2 через строку cmd в ваше приложение эта строка в памяти будет выглядеть как [2][\0], которая состоит только из 2 байтов. Проблема в том, что вы указываете размер в % edx как 4 , что неверно и заставит write() напечатать еще 2 байта памяти мусор на экран.

Правильный способ сделать то, что вы хотите, это реализовать функцию strlen() в вашем приложении. Эта функция перебирает поток байтов, считая количество байтов до появления символа \0. Только тогда вы сможете напечатать правильную строку. Используйте число, возвращаемое strlen() как % edx , когда вы write().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...