68k как добавить/вычесть отдельные байты?

Я использую easy68k, и у меня есть строка, и я хочу добавить число к каждой цифре, чтобы в итоге это была другая строка. Есть ли команда, которая позволяет мне нацеливаться на определенные байты в строке?

Например:

        ORG $1000
START:             
        MOVE.B  str,D0
        ADD.B   #$20,D0
        MOVE.B  D0,str

str     DC.B   'ASDF'
        END    START     

Я пытаюсь преобразовать «ASDF» в «asdf», но мой текущий код позволяет мне нацеливаться только на первый байт «ASDF», который равен «A», поэтому моя результирующая строка теперь «aDSF», как мне сделать значит, байты переходят на D, S и F? есть ли специальная команда для этого?

заранее спасибо


person ay lmao    schedule 21.01.2016    source источник


Ответы (1)


Бит может быть только 0 или 1. 0 и 1 — единственные цифры в числах с основанием 2.

xor — это добавление без переноса из младших битов в старшие. Это помогает? Тем не менее, тело вопроса, похоже, не соответствует названию.


У вас, к сожалению, очень запутана терминология. Вероятно, много технического смысла было потеряно при переводе с вашего родного языка.

  • «Цифра» обычно означает десятичную или шестнадцатеричную цифру: 0-9 или 0x0-0xF.

  • «Бит» всегда означает одно значение 0 или 1. Название этого вопроса не соответствует тому, что вы, кажется, спрашиваете в теле.

  • «Строка» обычно означает последовательность байтов ASCII (или UTF8, или UTF16), которая кодирует печатную строку. например char *str="Hello World!"; (т. е. не произвольный двоичный код.) Вы можете сказать «строка байтов», о чем, похоже, вы и говорите.

  • «Массив» — это последовательность элементов, например uint8_t arr={0xA2, 0x02, 0x15, 0xFF}; Кажется, это то, о чем вы говорите: массив байтов.

Пожалуйста, отредактируйте свой вопрос, чтобы переименовать его, если вы не собирались спрашивать об отдельных битах.


Это больше похоже на то, что у вас есть последовательность байтов, и вы хотите добавить одно и то же значение к каждому байту. Для этого вам понадобится цикл, так как нет набора инструкций SIMD для m68k, согласно Google. Инструкция SIMD может выполнять несколько однобайтовых сложений параллельно для каждого байта векторного регистра. (например, PADDBvector в x86, которую можно использовать после широковещательной передачи 0x20 в все 16 элементов векторного регистра.)

Добавление SIMD — это добавление с разрывами переноса от младших битов к старшим битам на границах элементов.

person Peter Cordes    schedule 22.01.2016
comment
Спасибо, да, кажется, моя терминология была действительно неправильной, я изменил ее, чтобы использовать правильную терминологию в своем посте, и добавил пример, мне интересно, как переместить байт, чтобы я мог ориентироваться на каждый отдельный байт, а не только на первый. в строке - person ay lmao; 22.01.2016
comment
@JoeyZhang: Если вы уже знаете, что все байты являются буквенными символами, вы можете использовать OR или AND для одновременной установки или очистки битов в нескольких байтах. (Или XOR для переключения). Это простая форма SWAR, и она работает, поскольку не может генерировать перенос, который распространяется в следующий байт. Если вы знаете, что все байты в верхнем регистре, вы можете использовать add вместо or, так как вы знаете, что это не будет переноситься. Кроме этого, у m68k нет SIMD-инструкций. - person Peter Cordes; 23.01.2016
comment
В остальном это язык ассемблера. Вам часто приходится перебирать байты в строке, потому что нет инструкций для всей строки. - person Peter Cordes; 23.01.2016