Почему я получаю этот странный результат?

#listview #assembly #segmentation-fault

#listview #сборка #ошибка сегментации

Вопрос:

Я написал этот код (скопируйте здесь как список, для оформления):

  1                                        global _start
 2                                      section .data
 3                                      Foos:
 4 00000000 B902000000                      mov ecx, 2
 5 00000005 BA00000000                      mov edx, 0
 6 0000000A 42                          L:      inc edx
 7 0000000B 83E901                          sub ecx, 1
 8 0000000E 0F94C0                          setz al
 9 00000011 D0E0                            shl al, 1
10 00000013 A2[19000000]                    mov byte [L1 1], al
11 00000018 EBF0                        L1:     jmp L
12 0000001A EBEE                            jmp L
13 0000001C A2[22000000]                    mov byte [L2 1], al
14 00000021 EBFE                        L2:     jmp L2
15 00000023 EBFC                            jmp L2
16 00000025 89D0                            mov eax, edx
17 00000027 C3                              ret
18                                      _start: 
19 00000028 E8D3FFFFFF                      call    Foos
20                                  
21 0000002D B801000000                      mov eax, 1
22 00000032 BB00000000                      mov ebx, 0
23 00000037 CD80                            int 0x80
  

Если я выполню этот код как есть, процесс завершится по мере необходимости, и eax будет содержать 2 после возврата из Foos.

Но, если я выполню этот код, заменив «section .data» на «section .text», я получу ошибку сегментации. Почему это незначительное изменение приводит к сбою программы?

Комментарии:

1. Потому .text что раздел обычно недоступен для записи.

2. Спасибо. Я не знал этого факта…