как реализовать новую строку

#assembly #x86

#сборка #x86

Вопрос:

я работаю в текстовом режиме 80×25 и ожидаю, что для печати будет напечатана некоторая строка символов, заканчивающаяся 0 (ранее CRLF не было). как я могу затем перейти к следующей строке? что мне действительно нужно, так это выровнять смещение es: edi (0: b8000) до следующего множителя 160, но я понятия не имею, как это сделать как-то умно. если вы уже делали это или у вас есть какие-либо идеи, пожалуйста, поделитесь ими со мной или дайте мне подсказку. я не хочу никаких прерываний, и предпочтительнее решения без разделения. спасибо stu

Комментарии:

1. На самом деле я не программист на ассемблере, но не могли бы вы добавить 160 к смещению, вычислить остаток с помощью DIV и вычесть его из смещения?

2. да, я думал об этом как о варианте, но это перезаписывает как минимум 2 регистра, и у меня их немного не хватает, но да, если нет способа добиться этого, я сделаю это таким образом

3. Другой подход заключается в простом использовании таблицы поиска на 2000 байт, смещение -> следующее 160-кратное.

4. это должно вписаться в загрузчик 🙂 то, что я использовал раньше, было обычной процедурой, подобной этой L1: переместить edi,0xb8000 160 добавить слово [L 1], 160 которое не работает, если вы печатаете целую строку..

5. почему бы вам не использовать прерывание?

Ответ №1:

Как сказал Андерс, я бы сделал что-то вроде:

 nextlineoffset = offset   (160 - ((offset   160) mod 160))
  

Это,

  1. Добавьте строку в смещение
  2. Вычтите лишнее смещение

Она использует одно деление, но устраняет необходимость в умножении.

Комментарии:

1. я скорее подумал, не мог бы я воспользоваться тем фактом, что 160 равно 128 32, которые всегда являются двумя одинаковыми битами, поэтому каким-то образом замаскируйте их, затем, если они установлены / очищены, оставьте их / обнулите их и все справа, затем добавьте 160.

Ответ №2:

Как насчет switch подобной конструкции? Если вас интересуют только фрагменты размером 160 символов на экране размером 80×25, необходимо учитывать только тринадцать случаев, и это должна быть управляемая (и визуализируемая) последовательность CMP и условных переходов.

Комментарии:

1. идея приятная, к сожалению, видеопамять заполнена не блоками по 160 символов, а парами цветовых символов, так что получается 25 случаев, и это 25*(5 5 2) (5 для cmp, 5 для mov и 2 для перехода на ветку) байт, и я получаю только 512 байт пространства в загрузчике, и у меня все еще есть работа, которую нужно выполнить. для того, что я пробовал, способ разделения был бы равен 14 байтам при каждом разрыве строки.

2. я думаю, что в конце подсчет напечатанных символов и проверка, было ли уже 80, является наиболее эффективным для памяти. это сравнение не из приятных, но оно постоянно составляет 9 байт, чего я вроде как и хотел.