Я должен написать программу уровня сборки, которая печатает мое имя, используя инструкцию LDBA с прямой адресацией в Pep 9

Итак, в 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

0xd не является кодом ASCII для 'H'. Это загрузка из адреса памяти, а не немедленная загрузка? Из какого исходного кода вы это построили? Вероятно, у вас должна быть метка в начале вашей строки, чтобы вы могли заставить ассемблер ссылаться на адреса в ней.

Peter Cordes 02.05.2018 05:00

Извините, я исправил. Да, он загружает байт из памяти в режиме прямой адресации. Первый набор ассемблерного кода был примером в книге. Я скопировал / вставил на pep9, запустил, и он распечатал "Привет"

IRedSonI 02.05.2018 05:11

Адреса жестко запрограммированы, но ваша вторая версия имеет больше байтов команд перед строкой. Итак, начало строки находится по другому адресу. Вот почему в обычных языках ассемблера используются метки, например. msg: .ASCII "Ariel", поэтому вы можете писать такие инструкции, как ldba msg+2, d, и ассемблер введет правильный адрес, как только он узнает, где в памяти начинается msg.

Peter Cordes 02.05.2018 05:17

Так что «msg» похоже на переменную? Почему вы написали msg + 2?

IRedSonI 02.05.2018 05:36

Да, asm не имеет переменных как таковых, но да, метка + несколько байтов памяти - это то, что компилятор C использовал бы для реализации static char msg[] = "Ariel"; Я написал msg+2, чтобы показать вам, что вы можете использовать смещения от метки вместо самого базового адреса; вам не нужно ставить метку на каждый байт в строке отдельно. (Но на самом деле, если вы все равно собираетесь использовать одну инструкцию на байт, вам не нужна строка в памяти. Используйте lda,i, чтобы использовать операнд как непосредственный и поместить его в AC напрямую, а не как адрес памяти: uffolk.li/cst111/19cst111/pep8.html)

Peter Cordes 02.05.2018 05:40

Хм, хорошо. По какой-то странной причине, когда я добавляю строку LDBA msg + 2, d, компилятор говорит, что мне нужен режим адресации

IRedSonI 02.05.2018 05:54

Я не знаком с инструментами PEP8 / PEP9, я не знаю, действительно ли они поддерживают метки, или вам нужно вычислять адреса самостоятельно. Или если есть другой синтаксис. Я просто говорю, что «нормальным» решением этой проблемы в хороших ассемблерах для реальных платформ являются метки. Надеюсь, у PEP9 есть метки, но я не гарантирую этого и не знаю, есть ли там особый синтаксис! Проконсультируйтесь с руководством или Google для этикеток PEP8 или чего-то еще

Peter Cordes 02.05.2018 05:56

Код работает без проблем, просто записывая сообщение LDBA, d, и он выводит 0000 в консоли. Для выполнения LDBA msg + 2, d может быть другой синтаксис.

IRedSonI 02.05.2018 06:00

Интересно. В любом случае, как я уже сказал, я бы посоветовал LDA 'A', i поместить значение ASCII A непосредственно в AC, не загружая ничего из памяти, если вы все равно собираетесь использовать отдельную инструкцию для каждого символа. (Надеюсь, это правильный синтаксис). Или используйте слово немедленно, затем char store / right shift / char store? Эх, вряд ли лучше.

Peter Cordes 02.05.2018 06:02

Хорошо, спасибо за вашу помощь

IRedSonI 02.05.2018 06:08
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
10
1 867
0

Другие вопросы по теме