Pull to refresh
361
0
Нина @ninacarrot

Production engineer

Send message
Спасибо за интересные статьи.
Пинки - здравому смыслу
image
Есть поговорка: «Если вы самый умный в комнате, вы не в той комнате».
Не уверен, что отвечу ваш полный безнадежности вопрос, но мне кажется, что вы странным образом сместили фокус. «Ни разу не встречал человека, который бы по 8 часов в сутки выполнял желания дяди и при этом был счастлив». А если вы это воспринимаете, не как «выполнение желаний дяди», а как совместое создание чего-то крутого и прекрасного? Например, пишете софт для ракет в SpaceX, реконструируете мозг или расшифровываете геном или помогаете придумывать новые фичи для Oculus Rift? Вы сидите на работе по 14-16 часов в сутки не потому, что у вас дедлайн, и не потому что дядя мудак, а потому вас прёт от этой работы, вы жрать её готовы, настолько сильно она вам нравится.

Найти такую работу и научиться получать от неё непрекращающееся удовольствие — это одна из самых осмысленных целей, которые могут быть у человека в жизни.
Выше — это выше по стеку вызовов. Как-то так:
UFO landed and left these words here
UFO landed and left these words here
UFO landed and left these words here
UFO landed and left these words here
Еще я не очень понимаю, почему был выбран ассемблер как язык программирования для ОС.
Уважать этот выбор я могу, а понять — нет.
Выиграть в быстродействии у современных компиляторов с С/C++ довольно трудно.
В быстродействии — трудно. В размере кода — тривиально.

Я могу представить себе некий транслятор с ассемблера intel в ассемблер для ARM.
Я когда-то писал нечто похожее с интел в 3rd-party CPU для FPGA.
Мне тогда потребовалось срочно реализовать алгоритм SHA для специфичного процессора для которого существовал только компилятор ассемблера
Теперь понятно, вы просто представляете себе неправильный образ. Для кода, который принимает на вход блок данных и даёт на выход преобразованный блок данных — да, в принципе это возможно. Но операционная система — это не код, который как-то преобразует заданные данные.

Операционная система управляет ресурсами компьютера. Ресурсы PC в значительной степени одинаковы на разных машинах — по крайней мере, достаточно, чтобы одна и та же дискета или флешка могла загружаться и выводить картинку на всех PC. Зоопарк ARM — другой, там даже загрузиться-то переносимо нельзя, не говоря уже о выводе картинки.
Для тех, кто хочет оценить всю магию сопрограмм и генераторов, есть две шикарнейшие презентации от Дэвида Бизли:

dabeaz.com/generators/
dabeaz.com/coroutines/
Смотрится красиво…
image
> Хотя есть не так много мест, где можно оплачивать товары биткоинами, их можно обменять, как и любую другую валюту

То есть, игровая компьютерная валюта, теперь, получается, тоже валюта? Особенно если где-то кто-то за игровое золото окажет реальную услугу или продаст реальный товар. (я тебе табуретку, ты мне 10 000 золотых в WoW).

Уважаемая налоговая, довожу до вашего сведения, что вчера паладин Goodknight убил дракона Onixia, и тем самым получил шлем качества epic, ориентировочной ценой в 20 000 золотых, и 15 000 золотых лута. И, насколько мне известно, не уплатил подоходный налог. Прошу возбудить дело.
«Алгоритмы — Построение и Анализ» (Кормен, Лейзерсон, Ривест, Штайн). Часть I, главы 1-4.
У нас действительно, во многих местах, для перевода нужно править исходный код. Ведь для каждого языка, склонение существительных, спряжение глаголов и длина слов разные:

if lang eq ru
; подождите 5 секунд, 4/3/2 секунды, 1 секунду
        cmp     al, 5
        mov     cl, ' '
        jae     @f
        cmp     al, 1
        mov     cl, 0xE3 ; 'у' in cp866
        jz      @f
        mov     cl, 0xEB ; 'ы' in cp866
@@:
        mov     [time_str+9], cl
else if lang eq et
        cmp     al, 1
        ja      @f
        mov     byte [time_str+9], ' '
        mov     byte [time_str+10], ' '
@@:
else if lang eq sp
; esperar 5/4/3/2 segundos, 1 segundo
        cmp     al, 1
        mov     cl, 's'
        ja      @f
        mov     cl, ' '
@@:
        mov     [time_str+10], cl
else
; wait 5/4/3/2 seconds, 1 second
        cmp     al, 1
        mov     cl, 's'
        ja      @f
        mov     cl, ' '


В других местах используется директива препроцессора, которая вставляет нужный файл с переводами, в зависимости от языка:

if lang eq ge
include "boot/bootge.inc"     ; german system boot messages
else if lang eq sp
include "boot/bootsp.inc"     ; spanish system boot messages
else if lang eq ru
include "boot/bootru.inc"      ; russian system boot messages
include "boot/ru.inc"          ; Russian font
else if lang eq et
include "boot/bootet.inc"      ; estonian system boot messages
include "boot/et.inc"          ; Estonian font
else
include "boot/booten.inc"      ; english system boot messages
end if
UFO landed and left these words here
Можно ещё сократить, первую и третью — до 24 байт, вторую — до 27 байт.
  • выходить из COM-программы можно не по int 20h, а по ret; в бинарнике второй программы это даже используется, в отличие от исходника;
  • int 29h сохраняет ah, так что «mov ah,1» и «int 29h» можно поменять местами, а пару команд «mov al,imm1» и «mov ah,imm2» можно заменить на одну «mov ax,imm2*256+imm1»;
  • если в мешанину условных переходов закрадывается безусловный, это повод подумать, нельзя ли переупорядочить код, избавляясь от безусловного перехода.

Первая программа:

org 100h
;;Угадай-ка

 int 16h ;;Ожидаем нажатие на клавишу
 mov bl, al ;;Сохраняем код клавиши в память

 still: ;;Главный цикл
 int 29h ;;Вывод символа на экран

 mov ax, 1*256+13;;al=13 - Возврат каретки, ah=1 - Опрос клавиатуры
 int 29h

 int 21h

 cmp al, bl ;;Сравнение кодов клавиш
 mov al, '+'
 ja still
 mov al, '-'
 jb still

 true:
 ret

Вторая программа:

org 100h
;;Баше

 mov dl, 15+4 ;;Поместим в dl количество палочек

 still: ;;Главный цикл
 sub dl, 4
 js fin

 mov ax, 1*100h+'|' ;;Выведем символ палочки 
 mov cl, dl ;;с помощью цикла,
 disp: ;;ровно cl раз
 int 29h ;;вызвав прерывание 29h
 loop disp

 int 21h

 sub al, '0' ;;Переводим ASCII-код в число

 cmp dl, al ;;Забрали последнюю палочку - значит, победили
 jne still

 win:
 int 29h ;;Выведем сердечко

 fin:
 ret

Третья программа:

;;Однорукий бандит

 push 0b800H ;;Обращаемся к видеопамяти
 pop ds 

 le: ;;Вывод символа
 inc bx
 inc bx ;;Переместим курсор

 inf: ;;Почти вечный цикл
 int 1AH ;;Вызываем таймер
 add dl, bl ;;Мешаем игроку победить, быстро нажимая клавишу "Вправо"
 mov [bx], dl ;;Выводим текущий символ на экран

 ;;Обработчик клавиатуры
 in al, 60H
 cmp al, 77 ;;Нажата кнопка "Стрелка влево", переходим к следующему символу
 jnz inf ;;Почти вечный цикл повторяется почти вечно

 re: ;;Пора выводить следующий символ или останавливать бандита
 cmp bx, 6
 jnz le

 ret ;;Конец программы

Information

Rating
Does not participate
Location
London, England - London, Великобритания
Registered
Activity