Как написать свою функцию вывода в консоль? - C (СИ)
Формулировка задачи:
наверно как-то с
GetStdHandle(STD_OUTPUT_HANDLE);
Решение задачи: «Как написать свою функцию вывода в консоль?»
textual
Листинг программы
.DATA s DB 'ВЫРАЖЕНИЕ',0 .CODE mov ah,0EH mov si,offset s next:lodsb int 10h test al,al jnz next
Объяснение кода листинга программы
s DB 'ВЫРАЖЕНИЕ',0
- в данной строке описывается переменнаяs
типаDB
(буфер), которая содержит строку'ВЫРАЖЕНИЕ'
и дополнительный символ 0, используемый для указания конца строки в кодировке ASCII.mov ah,0EH
- в этой строке происходит перенос содержимого регистраah
в регистрah
с кодовым значением 0EH (0E = 14), которое соответствует коду функции вывода в консоль в кодировке ASCII.mov si,offset s
- в данной строке происходит перенос содержимого регистраsi
в регистрsi
с смещением (offset) от начала сегмента данных (DS), где расположен буферs
.next:lodsb
- в этой строке описывается цикл, который начинается с меткиnext
. В теле цикла выполняется командаlodsb
, которая загружает в регистрal
байт из буфераs
и увеличивает смещение буфера на 1.int 10h
- в данной строке выполняется командаint
, которая вызывает прерывание 10h (2x OS), отвечающее за вывод символов в консоль.test al,al
- в этой строке выполняется командаtest
, которая сравнивает содержимое регистраal
с самим собой (al,al). Если результат сравнения не равен 0 (то есть, если в регистреal
содержится хотя бы один байт), то управление передается следующему командному октету.jnz next
- в данной строке описывается условие цикла, которое проверяет результат предыдущей командыtest
. Если результат не равен 0 (то есть, если в регистреal
содержится хотя бы один байт), то управление передается следующей итерации цикла с меткойnext
. Если же результат равен 0 (то есть, если в регистреal
содержится 0), то цикл завершается.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д