2016-01-21 5 views
1

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

, например:

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

str  DC.B 'ASDF' 
     END START  

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

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

ответ

2

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

xor - это добавление без переноса от младших разрядов до высоких бит. Это помогает? Однако орган вопроса, похоже, не соответствует названию.


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

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

  • А "бит" всегда означает a single 0 or 1 value. Название этого вопроса не соответствует тому, что вы, кажется, спрашиваете в теле.

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

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

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


Это похоже на то, что у вас есть последовательность байтов, и вы хотите добавить одно и то же значение к каждому байту. Для этого вам понадобится цикл, так как нет SIMD набора команд for m68k, accoding to google. Команда SIMD может выполнять несколько однобайтовых добавлений параллельно, на каждом байте векторного регистра. (например, x86's PADDB vector instruction, которые вы могли бы использовать после трансляции 0x20 ко всем 16 элементам векторного регистра.)

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

+0

Спасибо, да, похоже, моя терминология была действительно неправильной, я поменял ее на правильную терминологию в своем посте и добавил пример, мне интересно, как переместить байт, чтобы я мог настраивать каждый отдельный байт, а не просто первый в строке –

+0

@JoeyZhang: если вы уже знаете, что все байты являются алфавитными символами, вы можете использовать 'OR' или' AND' для установки или очистки бит в нескольких байтах одновременно. (Или 'XOR' для переключения). Это простая форма [SWAR] (https: //en.wikipedia.org/wiki/SWAR) и работает, потому что не может генерировать перенос, который распространяется в следующий байт. Если вы знаете, что все байты имеют верхний регистр, вы можете использовать 'add' вместо' or', так как вы знаете, что он не будет переноситься. Кроме того, m68k не имеет SIMD-инструкций. –

+0

Кроме этого, это язык ассемблера. Вам часто приходится перебирать байты в строке, потому что не существует целых строковых инструкций. –