Ассемблерная программа для переворачивания строки завершается после печати одного символа

Я пытаюсь написать программу сборки, которая принимает строку длиной 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
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
0
95
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий
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

Другие вопросы по теме