Online Compiler Nasm

extern scanf, printf section .data format_str db "%s ", 0 format_int db "%d ", 0 section .bss s1 resd 201 s2 resd 201 len1 resd 4 len2 resd 4 sptr resd 4 sless resd 4 spref resd 400 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) **Что делает код:**  
Программа считывает две строки, вычисляет их длины, определяет более длинную строку (sptr) и более короткую (sless), затем пытается выполнить слияние строк: добавляет символ `#` в конец длинной строки, после чего копирует содержимое короткой строки. В конце выводит длину первой строки (len1). Однако код содержит ошибки, из-за которых не собирается.

2) **Конкретные подсказки:**  
- Ошибка `write error on output file` часто возникает при попытке записи в сегмент `.text` (код) или при нарушении прав доступа к памяти. Проверь, что ты не пытаешься модифицировать данные, расположенные в read-only секции. В частности, строки `s1` и `s2` объявлены в `.bss` (что правильно), но обрати внимание на строку `mov byte [ebx], byte '#'` — ты пытаешься записать символ по адресу, который может выходить за пределы выделенной памяти. Убедись, что `sptr + len1` не превышает размер `s1` или `s2` (201 dword = 804 байта, но ты работаешь с байтами, а не dword).  
- Вторая ошибка: при копировании строки из `sless` в `sptr` ты используешь `mov al, [edx]` и затем `mov byte [ebx], al` — это корректно, но после этого цикл `merge_loop` начинается с `inc ecx` (ecx=1), а нужно начинать копирование со следующего символа. Проверь логику индексации и не забудь, что строки в памяти — это последовательности байт, а не dword.