Как заставить strcmp вернуть 0 в сборке - PullRequest
3 голосов
/ 14 мая 2011

Я хочу, чтобы вызов функции strcmp возвращал 0, что означает, что

int strncmp(const char *s1, const char *s2, size_t n);

const char *s1 и const char *s2 должны содержать одну и ту же строку.Если s2 указывает на строку "привет", а n равно 4, как я могу передать s1 десятичное значение, которое будет также соответствовать hello?

 8049e87:       c7 44 24 08 04 00 00    movl   $0x4,0x8(%esp) // 4
 8049e8e:       00
 8049e8f:       c7 44 24 04 80 bd 04    movl   $0x804bd80,0x4(%esp) // the constant is "hello"
 8049e96:       08 
 8049e97:       89 04 24                mov    %eax,(%esp) // The contents of %eax are a decimal (%d)
 8049e9a:       e8 61 ec ff ff          call   8048b00 <strncmp@plt>
 8049e9f:       85 c0                   test   %eax,%eax // I want this to be 0!

Я попытался передатьв десятичном значении для «h» в ASCII, и это, кажется, правильное направление, но не полностью.

1 Ответ

3 голосов
/ 14 мая 2011

По определению, возвращаемое значение strncmp равно нулю для двух одинаковых по регистру и длине строк.

Глядя на код вашей сборки, строка:

test   %eax,%eax

не является частью функции strncmp.

Используя отладчик, установите точку останова в этой инструкции. Проверьте регистр EAX, он должен быть равен нулю (в зависимости от того, возвращает ли функция strncmp свой результат в регистре EAX).

Инструкция по сборке test установит коды условий в зависимости от значения параметров. Популярный бит кода состояния - это бит ноль , указывающий, что выражение равно нулю. Следующая инструкция может быть скачком , если код условия равен нулю .

Если вы используете результат функции strncmp в математическом выражении или выражении, компилятор может сгенерировать другой код.

Попробуйте этот фрагмент:

  volatile int result = 0x55;
  volatile int a_value = 3;
  result = (strncmp("Hausaufgaben", "Hausaufgaben", 256) + 27) / 3;
  printf("Result is: %d\n", result);

Есть ли причина, по которой вам нужен компилятор для сохранения значения из strncmp?

Есть ли причина, по которой вам нужен компилятор для сравнения значения с постоянным числовым нулем?

...