Я никак не могу понять, почему мой код не работает как нужно:
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`.
Почему?