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: mov ebx, dword [sptr] push dword [len1] push format_int call printf add esp, 8 add esp, 8 xor eax, eax ret
Вот разбор вашего кода на NASM32:

## 1) Что делает код:
Программа считывает две строки (до 200 символов каждая) через `scanf`, вычисляет их длины, затем сравнивает длины и выбирает более короткую строку (или первую, если равны). В конце выводит длину первой строки (после возможной перестановки) через `printf`.

## 2) Подсказки для улучшения:
- **Ошибка с указателями**: В секции `.else` вы меняете местами `len1` и `len2`, но при этом теряете исходные значения. После обмена `sptr` указывает на более длинную строку, а `sless` — на более короткую, но вы затем выводите `len1`, который теперь содержит длину более короткой строки — это может быть не тем, что вы хотели.
- **Потенциальная проблема с буфером**: `scanf` с форматом `"%s "` (с пробелом) может вести себя неожиданно. Рекомендуется использовать `"%s"` без пробела или обрабатывать ввод более надёжно.