Online Compiler Nasm

extern scanf, printf section .data format_str db "%s ", 0 format_int db "%d ", 0 section .bss s1 resb 201 s2 resb 201 len1 resd 1 len2 resd 1 sptr resd 1 sless resd 1 spref resd 200 section .text global main main: mov ebp, esp ; for correct debugging push s1 push format_str call scanf add esp, 8 push s2 push format_str call scanf add esp, 8 xor ecx, ecx .len1_start: mov eax, dword [s1 + ecx] test eax, eax jz .len1_end inc ecx jmp .len1_start .len1_end: mov dword [len1], ecx xor ecx, ecx .len2_start: mov eax, dword [s2 + ecx] test eax, eax jz .len2_end inc ecx jmp .len2_start .len2_end: mov dword [len2], ecx mov eax, dword [len1] mov ebx, dword [len2] .if: cmp eax, ebx jl .else mov dword [sptr], s1 mov dword [sless], s2 jmp .endif .else: mov dword [sptr], s2 mov dword [sless], s1 mov eax, dword [len1] mov ebx, dword [len2] mov dword [len1], ebx mov dword [len2], eax .endif: ; На этом фрагменте код выдаёт nasm: error: write error on output file `main.o' mov ebx, dword [sptr] add ebx, dword [len1] mov byte [ebx], byte '#' inc ebx mov edx, [sless] mov al, [edx] mov byte [ebx], al xor ecx, ecx .merge_loop: inc ecx mov al, byte [edx + ecx] mov byte [ebx + ecx], al cmp al, byte 0 jne .merge_loop ; На этом фрагменте код выдаёт nasm: error: write error on output file `main.o' push dword [len1] push format_int call printf add esp, 8 xor eax, eax ret
Вот разбор вашего кода:

1) **Что делает код:**
   - Считывает две строки (s1, s2) через scanf
   - Вычисляет их длины (len1, len2) подсчётом символов до нулевого байта
   - Сравнивает длины и записывает в `sptr` указатель на более длинную строку, а в `sless` — на более короткую
   - Пытается выполнить слияние строк (вставить символ '#' и затем скопировать вторую строку)
   - Выводит длину первой строки через printf

2) **Конкретные подсказки:**
   - Ошибка "write error on output file" обычно возникает из-за **попытки записи в сегмент .text** (код). Проверьте, куда указывает `sptr` — он может указывать на адрес в коде, а не в .bss/.data. Убедитесь, что `sptr` и `sless` действительно содержат адреса из .bss.
   - В цикле `.merge_loop` вы используете `edx` как указатель на `sless`, но **не обновляете его при копировании**. После копирования первого символа вы увеличиваете `ecx`, но сам `edx` остаётся неизменным — это может привести к бесконечному циклу или записи за пределами буфера.