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 sub esp, 8 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 al, byte [s1 + ecx] test al, al jz .len1_end inc ecx jmp .len1_start .len1_end: mov dword [len1], ecx xor ecx, ecx .len2_start: mov al, byte [s2 + ecx] test al, al 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], '#' 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 add esp, 8 xor eax, eax ret
Вот разбор твоего кода:

1) **Что делает код:**  
   Программа считывает две строки (до 200 символов каждая), вычисляет их длины, затем сравнивает длины. Если первая строка короче второй, она меняет указатели местами (чтобы `sptr` указывал на более длинную строку, а `sless` — на более короткую). После этого код пытается дописать в конец более длинной строки символ `#`, затем первый символ более короткой строки, а потом всю оставшуюся часть короткой строки (то есть выполняет конкатенацию). В конце выводит длину первой строки (которая могла быть изменена).

2) **Конкретные подсказки:**  
   - Ошибка `write error on output file` почти всегда означает, что программа пытается писать в сегмент `.text` (код) или в другой защищённый участок памяти. Посмотри на строки:  
     `mov byte [ebx], '#'` — здесь `ebx` получает значение из `[sptr]` (адрес строки s1 или s2). Но строки s1 и s2 находятся в сегменте `.bss`, который доступен для записи. Проблема в том, что после `add ebx, dword [len1]` ты выходишь за границу выделенной памяти (s1 или s2 имеют размер 201 байт, а ты пытаешься писать за их пределами). Убедись, что `len1` не превышает 200, иначе будет выход за границу массива.  
   - Вторая проблема: после записи символа `#` ты делаешь `inc ebx`, а затем пытаешься скопировать строку из `[sless]`. Но ты не проверяешь, не выйдет ли `ebx` за пределы 201 байта. Для безопасной конкатенации нужно либо использовать отдельный буфер, либо проверять границы.