сложить два числа произвольных, вывести на консоль затупил на моменте - выводит из DL символ значения, а не значение (ну у меня там 70h в сумме, соответственно на консольку выводит "p"). А там "сунуть в регистр значение, потом добавить в регистр еще, потом вывести на консоль. А если там цинично складывать 2+2, то это вообще зона спец.символов и возможны чудеса на виражах. Короче, мне надо числовое представление вывести. Помню, что есть какой-то алгоритм преобразования, но сунувшись в инет че-то как-то совсем приуныл. Куда рыть, куда копать. Пример реально ученический, но я бля СЛИШКОМ давно это все смотрел и исключительно по диагонали, ибо нахер было не надо. А тут школоте (студентам) надо на нативной ХТ че-то показать и я как-то на жопу присел в том смысле, что нихуя не помню... org 100h mov al,20h add al,50h mov dl,al mov ah,2 int 21h ret Ну условно так, без заголовков как таковых для тасма и все такое. Чисто код. зы терзают смутные сомнения на счет mov dl,al зыы - уже не терзают, все правильно вроде тасм не знает про аам (вроде), нынче модняво делать через аам, как я понял... точнее, я нихера не понял, но пытаюсь
Так... Вот ЭТО вроде как работает... org 100h mov ax,2h add ax,5h aam add ax,3030h mov dl,ah mov dh,al mov ah,02 int 21h mov dl,dh int 21h ret искомое значение "7" исправно выводит и не падает. Я правда на эмуле 8086 гонял пока, не на тасме... Любые комментарии приветствуются...
Ну и всё правильно, символ и выводит: Не просто так результат вывести в консоль DOS. Сюда глянь: https://fasmworld.ru/uchebnyj-kurs/022-vyvod-chisel-na-konsol/
Чатжпт предлагает такой вариант и божится что это для Turbo Assembler на 8086 архитектуру .model small .stack 100h .data msg1 db 10, 13, "Enter first digit: $" msg2 db 10, 13, "Enter second digit: $" msg3 db 10, 13, "Sum: $" result db ? .code main: mov ax, @data mov ds, ax ; Display prompt for the first digit mov ah, 09h lea dx, msg1 int 21h ; Read the first digit mov ah, 01h int 21h sub al, 30h ; Convert ASCII to numeric value mov bl, al ; Display prompt for the second digit mov ah, 09h lea dx, msg2 int 21h ; Read the second digit mov ah, 01h int 21h sub al, 30h ; Convert ASCII to numeric value add bl, al ; Add the two digits ; Convert the sum back to ASCII add bl, 30h mov result, bl ; Display the result mov ah, 09h lea dx, msg3 int 21h mov ah, 02h mov dl, result int 21h mov ah, 4Ch int 21h end main
Да как бы не отсюда и брал кусок, где преобразование через запхание в AX 3030h делается. Метод рабочий, но до определенных пределов. Дальше надо по условиям раскидывать и в зависимости от разные значения на сдвиг подсовывать.
Чат гпт конечно наше все, но по словам истерично ржущего старшего, который сам сейчас с асмом трахается - "херня это все, оно не работает"... Он вообще мазохист, типа "нахер эмуль, оно работать не будет"... и продолжает париться с той IDE которое с них препод требует под ту или иную лабораторку. Старший хотел на 32 битах сделать, хуй - давай, мочи в 16... А у меня сейчас как раз практиканты, а я им "историю развития платформы" читаю, от 8086 и до момента на котором они сами за компьютер сели. Показал живую ХТ с EGA - у людей отвал башки от откровений...
Так. Какая-то херомантия. В принципе после засовывания 3030н в АХ, там все правильно, но... Я же потом туда код процедуры 21-го прерывания сую и старшая половина затирается кодом... Брр... Т.е. вывод корректный, пока я из габаритов AL не вылезаю, а если что-то в верхний попадает - то затирается присвоением значения 2...
Для общего развития. Регистры, прерывания MS-DOS и прочая лабуда на простых примерах. Тут даже не столько студноте показать что-то, у них на это профильные преподы есть. Тут больше что б самому лохом полным не выглядить и понимать о чем люди говорят. Самообразование короче.
Там по ссылке канонический вывод чисел в десятичном виде через извлечения остатков от деления на 10 и разворотом результата через стек.
Короче. "Я сделаль..." org 100h mov al,45 add al,37 aam add ax,3030h mov bx,ax mov dl,bh mov ah,02 int 21h mov dl,20h int 21h mov dl,bl int 21h mov ah,4ch int 20h ret Вывод в консоль - 82
Теперь выведи 100+ Для чего этот пробел? mov dl,20h int 21h И для чего mov ah,4ch перед int 20h? 4c - функция int 21h:
Там кстати есть пример вывода байта - calculate sum (обрезал лишнее): Code: name "calc-sum" org 100h ; directive make tiny com file. ; print result in decimal: mov al, m call print_al ; wait for any key press: mov ah, 0 int 16h ret ; variables: m db 255 print_al proc cmp al, 0 jne print_al_r push ax mov al, '0' mov ah, 0eh int 10h pop ax ret print_al_r: pusha mov ah, 0 cmp ax, 0 je pn_done mov dl, 10 div dl call print_al_r mov al, ah add al, 30h mov ah, 0eh int 10h jmp pn_done pn_done: popa ret endp
Да, больше 100 оно корявит, я в курсе. Т.е. решение с принудительным пробелом - это что б не парится с позиционированием курсора для вывода следующего значения. Т.е. упрощенная реализация, что б лишнего не воротить. Тут я понимаю, что костыль, но это осознанный костыль Косяк с 4сн и прерыванием - выйти можно и через 4сн (и тогда да, надо 21) или просто вызвать 20-е, это "брек". Т.е. либо писать 21, либо убирать 4сн, оно тогда не нужно. Видать когда писал, еще не решил как оставить, а потом тупо забыл и оно выходит по двадцатому.
Понятно, только он у тебя в этой реализации выводится между цифрами числа, а не после них, как задумано.
Не. Просто когда пошагово выполняешь, одно значение другое затирает. Когда просто на исполнение запускаешь, выводит нормально (сейчас закомментарил, и запустил именно на исполнение - все Ок).
Вот так без пробела между значениями выводит, если запуск делать, а не пошагово. Ну и лишнее закомментарил. org 100h mov al,55 add al,44 aam add ax,3030h mov bx,ax mov dl,bh mov ah,02 int 21h ;mov dl,20h ;int 21h mov dl,bl int 21h ;mov ah,4ch int 20h ret