Итак, в Pep 9 есть пример способа распечатать .ascii "привет".
;File: fig0433.peph
;Computer Systems, Fifth edition
;Figure 4.33
LDBA 0x000D,d ;Load byte accumulator 'H'
STBA 0xFC16,d ;Store byte accumulator output device
LDBA 0x000E,d ;Load byte accumulator 'i'
STBA 0xFC16,d ;Store byte accumulator output device
STOP ;Stop
.ASCII "Hi" ;ASCII "Hi" characters
.END
Я попытался использовать логику имени, чтобы написать свое имя, но на выходе были странные символы: Ñ
Может ли кто-нибудь объяснить мне, почему эта логика не работает, и я хотел бы, чтобы кто-то направил меня в правильном направлении.
;Stan Warford
;May 1, 2016
;A program to output "Hi"
;
LDBA 0x000C,d ;Load byte accumulator 'A'
STBA 0xFC16,d ;Store byte accumulator output device
LDBA 0x000D,d ;Load byte accumulator 'r'
STBA 0xFC16,d ;Store byte accumulator output device
LDBA 0x000E,d ;Load byte accumulator 'i'
STBA 0xFC16,d ;Store byte accumulator output device
LDBA 0x000F,d ;Load byte accumulator 'e'
STBA 0xFC16,d ;Store byte accumulator output device
LDBA 0x0010,d ;Load byte accumulator 'l'
STBA 0xFC16,d ;Store byte accumulator output device
STOP ;Stop
.ASCII "Ariel" ;ASCII "Ariel" characters
.END
Извините, я исправил. Да, он загружает байт из памяти в режиме прямой адресации. Первый набор ассемблерного кода был примером в книге. Я скопировал / вставил на pep9, запустил, и он распечатал "Привет"
Адреса жестко запрограммированы, но ваша вторая версия имеет больше байтов команд перед строкой. Итак, начало строки находится по другому адресу. Вот почему в обычных языках ассемблера используются метки, например. msg: .ASCII "Ariel"
, поэтому вы можете писать такие инструкции, как ldba msg+2, d
, и ассемблер введет правильный адрес, как только он узнает, где в памяти начинается msg
.
Так что «msg» похоже на переменную? Почему вы написали msg + 2?
Да, asm не имеет переменных как таковых, но да, метка + несколько байтов памяти - это то, что компилятор C использовал бы для реализации static char msg[] = "Ariel"
; Я написал msg+2
, чтобы показать вам, что вы можете использовать смещения от метки вместо самого базового адреса; вам не нужно ставить метку на каждый байт в строке отдельно. (Но на самом деле, если вы все равно собираетесь использовать одну инструкцию на байт, вам не нужна строка в памяти. Используйте lda,i
, чтобы использовать операнд как непосредственный и поместить его в AC напрямую, а не как адрес памяти: uffolk.li/cst111/19cst111/pep8.html)
Хм, хорошо. По какой-то странной причине, когда я добавляю строку LDBA msg + 2, d, компилятор говорит, что мне нужен режим адресации
Я не знаком с инструментами PEP8 / PEP9, я не знаю, действительно ли они поддерживают метки, или вам нужно вычислять адреса самостоятельно. Или если есть другой синтаксис. Я просто говорю, что «нормальным» решением этой проблемы в хороших ассемблерах для реальных платформ являются метки. Надеюсь, у PEP9 есть метки, но я не гарантирую этого и не знаю, есть ли там особый синтаксис! Проконсультируйтесь с руководством или Google для этикеток PEP8 или чего-то еще
Код работает без проблем, просто записывая сообщение LDBA, d, и он выводит 0000 в консоли. Для выполнения LDBA msg + 2, d может быть другой синтаксис.
Интересно. В любом случае, как я уже сказал, я бы посоветовал LDA 'A', i
поместить значение ASCII A
непосредственно в AC, не загружая ничего из памяти, если вы все равно собираетесь использовать отдельную инструкцию для каждого символа. (Надеюсь, это правильный синтаксис). Или используйте слово немедленно, затем char store / right shift / char store? Эх, вряд ли лучше.
Хорошо, спасибо за вашу помощь
0xd не является кодом ASCII для
'H'
. Это загрузка из адреса памяти, а не немедленная загрузка? Из какого исходного кода вы это построили? Вероятно, у вас должна быть метка в начале вашей строки, чтобы вы могли заставить ассемблер ссылаться на адреса в ней.