Задать вопрос
@sakair

Почему в коде assembler выдает бесконечный цикл?

В общем вот код assembler для nasm
section .data
mess: db "Hello, World", 10
len: equ $ - mess ;Длина строки

section .text
_start:
    mov rcx, 5
loop:
    mov rax, 1
    mov rdi, 1 
    mov rsi, mess
    mov rdx, len
    syscall

    dec rcx 
    jnz loop
exit:
    mov rax, 60
    xor rdi, rdi ; Код возрата
    syscall

И этот код должен был вывести 5 раз Hello World. Но он выдает бесконечный цикл.
Я провел один тест
global _start
section .text
_start:
    mov rcx, 5
    mov rdi, 0
loop:
    add rdi, 1
    dec rcx 
    jnz loop
exit:
    mov rax, 60
    syscall

то вывод будет:
echo $status
5
То есть цикл выполнился 5 раз. Почему первый код выдает бесконечный цикл, а второй как задумывался?
  • Вопрос задан
  • 63 просмотра
Подписаться 1 Простой Комментировать
Решения вопроса 1
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
Инструкция syscall изменяет регистры RCX и R11. В регистр RCX сохраняется предыдущее значение регистра RIP, в регистр R11 - предыдущее значени RFLAGS. Регистр флагов RFLAGS изменяется в соответствии с системным вызовом. Если RCX и R11 используются в коде, то их следует сохранить перед вызовом syscall.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

Похожие вопросы