Pull to refresh

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

Reading time 1 min
Views 6.6K
Дано — null-terminated string, расположенная в памяти по некоторому адресу. Допустим «kukaga»,0x0h.
Задача — получить на выходе строку наоборот, «agakuk»,0x0h
Точнее -указатель на область памяти, где лежит перевернутая строка

Посмотрим решения на базе i8080 архитектуры.

Просьбе к знатокам ассемблеров не-x86 архитектуры — дайте пример этой задачи в ассемблере для знакомой вам архитектуры. Просто чисто интересно сравнить.



Первый вариант — алгоритм цикла. Вносим в свободную память строку вверх ногами. Самое главное — не уйти за пределы памяти. Обработку границ оставим за рамками примера.

DE — указатель на строку

PUSH D
POP H
DCX H
MVI M,0

LABEL1:
XCHG
MOV A,M
XCHG
MOV M,A
DCX H
INX D
JNZ LABEL1
INX H


В HL — указатель на перевернутую строку

Второй вариант:

PUSH D
POP H
DCX H
MVI M,0

LABEL1:
XCHG
MOV A,M
JZ LABEL2
XCHG
MOV M,A
DCX H
INX D
JMP LABEL1

LABEL2:

В DE — указатель на перевернутую строку

Вариант с как-бы рекурсией. Регистр BC — на строку. Тут надо еще чтоб стек не залез в область памяти. И снова границы — за рамками примера.

PUSH B
POP D
DCX D
XCHG
MVI M,0
XCHG

LABEL1:
LXI H,LABEL1
PUSH H
LDAX B
INX B
DCX D
STAX D
CMP A
RNZ
POP H
INX D

В DE — указатель на строку перевертыш

Спрашивайте, советуйте, критикуйте

Решение для i8086 я не привел, так как там все сводится к scasb, rep, movsb. Слишком просто. Но если хотите — то могу написать
Tags:
Hubs:
+8
Comments 14
Comments Comments 14

Articles