Инкрементная петля в NASM - PullRequest
0 голосов
/ 08 мая 2018

У меня возникают проблемы при попытке заставить этот код сборки работать:

section .text
    global _start 
_start: 
loop: 
    mov rax, 4
    mov rdi, 1
    add rsi, 1
    mov rdx, 1
    syscall
    cmp rsi,11
    jne loop
exit: 
    mov rax,60
    xor rdi,rdi
    syscall

Цель этого кода - увеличить значение в регистре rsi и распечатать его.значение 10 раз.Это написано в NASM на машине Linux x86_64.

1 Ответ

0 голосов
/ 08 мая 2018

В вашем ответе несколько ошибок, прежде всего номер системного вызова. Вы вводите значение 4 в rax, но для x86_64 linux значение для sys_write равно 1

http://blog.rchapman.org/posts/Linux_System_Call_Table_for_x86_64/

во-вторых, у вас есть проблема с вашими аргументами, вызов sys_write выглядит следующим образом: sys_write(unsigned int fd, const char *buf, size_t count), где rdi - fd, rsi - buf и rdx - count , Проблема с вашим вызовом заключается в том, что вы ставите rsi в качестве буквального значения 1, которое заставляет linux перейти по адресу 0x1, чтобы найти что-то для печати, что явно недопустимо.

рассмотрите этот пример для правильного способа печати числа '1' и затем новой строки

section .data
    myNum: db '1', 0xA

section .text
global _start
_start:
    mov rax, 1
    mov rdi, 1
    mov rsi, myNum
    mov rdx, 2
    syscall
    mov rax, 60
    mov rdi, 0
    syscall

если вы собираетесь понизить голос, пожалуйста, объясните, что вы считаете неправильным с ответом, просто нажатие кнопки понижения голосов никому не поможет

...