Я пытаюсь написать программу сборки, которая принимает строку длиной 5 и печатает обратную строку. Я попытался напечатать символы один за другим в обратном порядке, используя цикл с ecx = 5. Чтобы напечатать символы, я вычисляю обратный адрес, а затем использую подпрограмму для печати этого символа.
Но, кажется, в моем коде ошибка, он выводит только первый символ.
Например, для данного ввода 12345 я получаю 1 в качестве вывода, но я ожидал, что он напечатает 54331
segment .bss
INPT: resb 5
segment .text
global asm_main
asm_main:
mov eax, 3 ; system call no (sys_read = 3)
mov ebx, 1 ; std_in = 1
mov ecx, INPT ; ptr to location to store input (INPT)
mov edx, 5 ; no of bytes to read
int 0x80 ; issue a system call
mov ecx, 5
swap:
mov edx, -8
imul edx, ecx
add edx, 40
add edx, INPT ; address of next byte to print = [INPT + 5 * 8 - ecx * 8]
call print
loop swap
jmp exit
print:
push ecx
mov eax, 4
mov ebx, 1
mov ecx, edx
mov edx, 1
int 0x80
pop ecx
ret
exit:
mov eax, 1
xor ebx, ebx
int 0x80





INPT: resb 5
Это резервирует 5 байт. Но расчет имеет следующий комментарий
; адрес следующего байта для печати = [INPT + 5 * 8 - ecx * 8]
ожидание элементов qword!
Даже если вы исправите вышеприведенное, изменив -8 на -1, вы все равно не реверсируете ввод! lea ecx, [INPT + ecx - 1] может помочь.
Кроме того, обратите внимание, что STDIN = 0 и что sys_read возвращает количество, которое вы должны использовать вместо этого фиксированного числа 5.
Также не используйте медленную инструкцию LOOP и почему бы не вызвать print с готовым адресом в регистре ECX.
Наконец, вы можете зациклить, используя регистр, который не затирается последующими вызовами. Это экономит на толчках и хлопках.
Чтобы перевернуть печать, используйте это:
asm_main:
mov eax, 3 ; system call no (sys_read = 3)
xor ebx, ebx ; std_in = 0
mov ecx, INPT ; ptr to location to store input (INPT)
mov edx, 5 ; no of bytes to read
int 0x80 ; -> EAX
mov edi, eax
swap:
lea ecx, [INPT + edi - 1] ; address of next byte to print in reverse order
call print
dec edi
jnz swap
jmp exit
print:
mov eax, 4
mov ebx, 1
mov edx, 1
int 0x80
ret
exit:
mov eax, 1
xor ebx, ebx
int 0x80