Дано — 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. Слишком просто. Но если хотите — то могу написать
Задача — получить на выходе строку наоборот, «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. Слишком просто. Но если хотите — то могу написать