greeting:
mov eax, 4
mov ebx, 1
mov ecx, greet
mov edx, greetL
sys.write
getname:
mov eax, 3
mov ebx, 0
mov ecx, name
mov edx, 50
sys.read
Я не знаю, что эти макросы sys.write
и sys.read
могут сделать для вас, но есть вероятность, что они загрузят eax
с правильным значением перед вызовом системного вызова с int 0x80
, так что вы вероятно, не нужно делать это самостоятельно. Иначе в них нет особого смысла ...
(Это не проблема; 4
и 3
являются правильными номерами системных вызовов для write
и read
соответственно в 32-битной Linux x86.)
Фактическая проблема, вероятно, здесь:
xor ecx, ecx
mov eax, ecx
push ecx
Это выглядит неправильно: вы исключаете ИЛИ ecx
с самим собой, что устанавливает его на ноль. Затем вы присваиваете ecx
(который теперь равен 0) eax
(который является результатом системного вызова), поэтому результат системного вызова отбрасывается. Затем вы помещаете ecx
(который по-прежнему равен 0) в стек.
Еще дальше, у вас есть:
xor ebx, ebx
xor ecx, ecx
xor edx, edx
pop ecx
sub ecx, 1
mov edx, ecx
... что также странно: почему ноль ecx
и edx
с инструкциями xor
, когда вы просто собираетесь перезагрузить их из других мест, еще пару инструкций?
Полагаю, у вас просто могут быть операнды mov
в неправильном направлении. Вместо:
xor ecx, ecx
mov eax, ecx
push ecx
... если вы сказали:
xor ecx, ecx
mov ecx, eax
push ecx
.... вы бы по крайней мере успешно поместили значение, которое было в eax
(код возврата из системного вызова) в стек, хотя было бы намного проще просто сказать:
push eax
Наконец: вы задаете вопрос «name» и (предполагая, что вышеупомянутое исправлено) помещаете полученную длину в стек. Затем вы задаете «цветной» вопрос и помещаете полученную длину в стек.
Но затем вы печатаете сюрприз «имя», используя первое значение, извлеченное из стека, которое является длиной, которую вы сохранили из вопроса о «цвете». (Стек - «первым пришел - первым обслужен!»). Затем вы печатаете «цветной» сюрприз, используя длину из вопроса «name».