Присвоение значения элементу массива в сборке (синтаксис GAS) - PullRequest
0 голосов
/ 23 ноября 2018

У меня есть следующий код C, который возвращает 9:

#include <stdio.h>
int main()
{
    int array[4]={0};
    array[2]=9;
    return array[2];
}

Чтобы выполнить то же самое на языке ассемблера, который я пробовал:

.section .data
array: .zero 4    
.section .text
    .globl _start
_start:
    mov $2,%esi
    mov array(,%esi,4),%ecx   # copy address of array[2] to %ecx
    mov $9,%ecx
    mov $1,%eax
    mov array(,%esi,4),%ebx   # return the value of array[2]
    int $0x80

собран и связан с:

gcc -g -c array.s && ld array.o && ./a.out

Однако эта программа возвращает 0 вместо 9:

>./a.out
>echo $?
0

Я подозреваю, что проблема в строках с комментариями.После различных неудачных попыток найти проблему я решил задать вопрос: как изменить значение элемента массива (в данном случае array[2]) в сборке?

1 Ответ

0 голосов
/ 23 ноября 2018
.section .data
array: .zero 16               # allocate 16 bytes instead of 4
.section .text
    .globl _start
_start:
    mov $2,%esi
    lea array(,%esi,4),%ecx   # copy address of array[2] to %ecx, not the value
    mov $9, %ebx
    mov %ebx,(%ecx)             # assign value into the memory pointed by %ecx
    mov $1,%eax
    mov array(,%esi,4),%ebx
    int $0x80
...