Как написать свою функцию вывода в консоль? - 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), то цикл завершается.