ARM7 функция печати / вывода - PullRequest
1 голос
/ 04 февраля 2012

Я пытаюсь реализовать простой компилятор ассемблера Pascal to ARM. Мне нужно реализовать функцию write (), но я не знаю, как это сделать на ассемблере. Я пытался гуглить, но безуспешно. Я использую Keil uVision 4 для эмуляции моего ассемблерного кода.

Допустим, я хотел бы скомпилировать следующую программу:

PROGRAM myProg;
var A : integer;

BEGIN

A := 5;
write(A);

END.

Как бы это выглядело в сборке ARM?

Ответы [ 3 ]

0 голосов
/ 10 февраля 2012

Alex

Здесь так много факторов ... какова цель исполняемого файла? Какая-то операционная система или аппаратное обеспечение? Если это ОС, вам будет доступен API, который должен выполнять большую часть тяжелой работы от вашего имени.

Но даже тогда это только половина истории. Позади write () - огромная библиотека для обработки выходных данных, которая знает, как преобразовать входные данные в значимые выходные данные: write () - одна из тех странных процедур, которая принимает переменное число нетипизированных параметров и каким-то волшебным образом все их понимает.

Как сказал Марко, вы могли бы взглянуть на вывод ассемблера FP, но у меня есть ощущение, что вы быстро увязнете во множестве подпрограммных вызовов.

Другой вариант может заключаться в том, чтобы просто продвинуть идею Марко немного дальше - разве вы не можете просто использовать Free Pascal? Даже если у вас нет операционной системы на целевом устройстве, вы все равно можете заставить ее выполнять большую часть работы за вас. Вы, несомненно, должны были бы предоставить хуки для stdin и stdout, но кроме этого FP может быть подходящим ответом?

0 голосов
/ 10 февраля 2012

write () - это вещь операционной системы, а не инструкция процессора.для реализации чего-то подобного операционная система требует от многих сотен до сотен тысяч инструкций, вам нужно либо ориентироваться на операционную систему, либо создавать свою собственную, а затем создавать интерфейс от процессора к этой операционной системе, например, вы можетевыберите использование инструкции swi для выполнения системных вызовов.

Вам больше повезет, если вы просто создадите компилятор, который компилируется в набор инструкций, операции alu, add, sub, xor и т. д. чтение и записьадреса памяти и т. д.

Теперь вы на самом деле спрашивали, как записывать память, а А - это адрес в памяти?(мой паскаль довольно ржавый), затем посмотрите на ваш набор инструкций arm, есть несколько различных инструкций, в первую очередь вы захотите взглянуть на инструкции str, str, strh и strb (некоторые руки имеют strd).Так как это ваш паскаль-компилятор, вы можете сделать так, чтобы write () делала все, что вы хотите, так что если это то, что вы намеревались начать с инструкции str и перейти оттуда.работая над ассемблером arm, забудьте о компиляторе паскаля ... Затем создайте компилятор паскаля, который создает ассемблерный код, который вы знаете, как использовать и писать.Если вы сами не знаете, как это сделать на ассемблере, не позволяйте компилятору делать это.

0 голосов
/ 07 февраля 2012
  1. Преобразовать целое число в строку
  2. цикл над строкой
  3. для каждого символа в строке, выведите его на ваше устройство вывода

Вы можете поэкспериментировать с «бесплатным паскалем», как выглядит ассемблер, он поддерживает несколько архитектур ARM.

...