Я знаю, что есть 3 способа передать данные ввода-вывода: программный режим, режим прерывания и режим DMA. А для программного режима, если я хочу передать байт из IO в RAM, я должен написать вот так
MOV PORT1,000AH # tell io the address
IN ACC,PORT2 # read data from this address
MOV [0x5566], ACC # mov this data to RAM
И если я хочу передать много байтов, я передаю эту программу. Это нормально. Но вот мой вопрос:
Что, если я хочу использовать режим DMA, как написать свой язык ассемблера для передачи большого количества байтов из ввода-вывода в ОЗУ?
Я знаю, как работает DMA, но я не понимаю, кто им говорит об этом? Я думаю, что ЦП должен указывать начальный адрес ввода-вывода, длину данных и адрес ОЗУ. Все это, каким должен быть ассемблер?
Я много нашел, но не нашел ответа. Я пропустил что-то важное, что меня запутало? Надеюсь на чью-то помощь. Спасибо
Спасибо за ответ, как написать этот asm? просто передайте много байтов из ввода-вывода в ОЗУ. Например, передача из IO (0000h ~ 00FFh) в RAM (0000h ~ 00FFh), только это
Трудно ответить, поскольку в тегах написано «x86», но код не является сборкой x86. Не зная архитектуры, мы не можем ответить иначе, как концептуально.
Весь смысл DMA в том, что ЦП не задействован; периферийное устройство временно берет на себя управление шиной и использует ее для прямого доступа к памяти. Для этого ЦП запускает периферийное устройство мая, но если и как это произойдет, полностью зависит от архитектуры подсистемы. «Передавать данные ввода-вывода» - это слишком общее понятие; на ваш вопрос можно ответить только для конкретного периферийного устройства.





Я никогда не программировал DMA. Но глядя на SetDMAAddress здесь, кажется, что вы правы. Есть несколько инструкций
outдля настройки адресов для портов страниц и портов адреса, а также дополнительныеoutдля включения и установки режима. А также куча других вещей, которых я, честно говоря, не понимаю. Надеюсь, эти страницы помогут.