@MikePros

"Jump if equal" не работает?

Я никак не могу понять, почему мой код не работает как нужно:
section .data

ok: db "Счетчик аргументов равен 1" , 10, 13, 0
err: db "Счетчик аргументов не равен 1" , 10, 13, 0

section .text
    global _start
_start:

    mov rax, [rsp]
    cmp rax, 2             ;если ARGC == 1
    jne ..@7.ifnot
    mov rcx, ok
    mov rax, 1
    mov rdi, 1
    mov rdx, 1

..@10.while:               ;вывести 'Счетчик аргументов равен 1\r\n' в консоль
    cmp [rcx], dword 0
    je ..@10.endwhile      ;Эта строка
    mov rsi, rcx
    push rcx
    syscall
    pop rcx
    inc rcx
    jmp ..@10.while
..@10.endwhile:

    jmp ..@7.ifend
..@7.ifnot:           ;если ARGC !== 1
    mov rcx, err
    mov rax, 1
    mov rdi, 1
    mov rdx, 1

..@15.while:           ;вывести 'Счетчик аргументов не равен 1\r\n' 
    cmp [rcx], dword 0
    je ..@15.endwhile
    mov rsi, rcx
    push rcx
    syscall
    pop rcx
    inc rcx
    jmp ..@15.while
..@15.endwhile:

..@7.ifend:            ;и выйти
    mov rax, 60
    mov rdi, 0
    syscall

Когда я пишу в консоли ./test, выводится "Счетчик аргументов не равен 1" (ожидаемое поведение).
Но если я запускаю ./test abcd, то в консоли выводится
Счетчик аргументов равен 1
Счетчик аргументов не равен 1

Когда байт по адресу RCX равен нулю и программа достигает строки `je ..@15.endwhile`, инструкция JE просто не перескакивает на метку `..@15.endwhile`.

Почему?
  • Вопрос задан
  • 54 просмотра
Решения вопроса 1
jcmvbkbc
@jcmvbkbc
"I'm here to consult you" © Dogbert
Когда байт по адресу RCX равен нулю и программа достигает строки `je ..@15.endwhile`, инструкция JE просто не перескакивает на метку `..@15.endwhile`.

Почему?

Потому что не должна. Потому что cmp [rcx], dword 0 -- это вообще странная запись. Канонично было бы написать cmp dword ptr [rcx], 0. Но в любом случае, вы не "байт по адресу RCX" сравниваете с 0, а целое слово. Ну и между строчками ok и err нет целого слова нулей, но вот после err, очевидно, есть.
Как сделать правильно? cmp byte ptr [rcx], 0
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы