хранение строки и манипулирование ею на языке ASM на ATmega168V (первое домашнее задание) - PullRequest
2 голосов
/ 23 января 2011

Я пытаюсь сохранить строку в памяти, получить доступ к этой строке и изменить строчные буквы на прописные и наоборот. Я не понимаю, как ссылаться на адрес строки и значение ascii по этому адресу. Я считаю, что могу понять логику, просто возникли проблемы с манипулированием данными и адресами. Как мне различить два? ПРИМЕЧАНИЕ. Это домашнее задание по кодированию.

Ответы [ 2 ]

0 голосов
/ 24 января 2011

Доступ к строке различается в зависимости от того, находится она во флэш-памяти или в ОЗУ (я думаю, что строки могут быть скопированы в ОЗУ при загрузке, но я не уверен). Однако, учитывая, что это домашнее задание, у вас, вероятно, есть прямой доступ к строке в оперативной памяти. Как указывает @EnabrenTane, вы можете просто перевернуть бит 5 байта символа, чтобы изменить регистр (прочитайте превосходную страницу ASCII Википедии , чтобы узнать больше о байтовых кодах ASCII). Итак, если вам нужно было сделать это в C:

char the_string[6] = "foobar" // assuming string is created like this
int l = 6 * sizeof(char); // the length of the string

for(int i=0; i<l; i++) {
    char* c = the_string + i; // grab char[i] of the string
    *char = *char ^ 0x20; // flip the case
}

(я не пробовал компилировать это, поэтому могут быть ошибки)

Для строк, созданных как та, что выше значения, хранящегося в the_string, это фактически указатель на адрес первого символа. Чтобы найти определенный символ в этой строке, вы просто добавляете адрес. Чтобы манипулировать строкой, вам нужно разыменовать указатель char* и - в этом примере - сохранить значение обратно в то же место, переписав исходное значение.

0 голосов
/ 23 января 2011

Совет.Отразите бит «32» с помощью xor value,0x20 для переключения регистра.

На ассемблере Z80 это будет что-то вроде

SRC:    DB      'Press A Key To Continue', 0; Our source string
DST:    DB      'Press A Key To Continue', 0; Where we will put our string. make sure its big enough so we don't over write our program.
;load MSG+0 to working regist
;flip the 32 bit
;move the working register to DST + 0
;load MSG+1 and repeat
...