Before me was the task, using Internet resources to write and run the code to derive the result of calculations using the formula. The numbers B, C, D are given in dec. A = B - C + 1. B = 45, C = 10, D = 1.

.model small ; тип данных? .data ; набор данных B dw 45 ; в какой системе они здесь обычно указываються, C dw 10 D dw 1 result dw ?,'$' ; ? - мы не знаем еще значения, и что делает $? читал, что это первый символ полученный? .code ; сегмент кода mov ax, @data ; не знаем сдвиг mov ds, ax ; сдвиг равен будет какому-то значению mov ax, B sub ax, C inc ax mov di, offset result ; что здесь толком происходит mov [di], ax ; что здесь толком происходит mov ah, 09h ; не понимаю, во многих вроде функция вывода mov dx, offset result ; int 21h ; interrupting mov ah, 4ch ; не понимаю int 21h end 

In short, the nonsense came out, you see. Just do not shout "fu" right away, but help with the code. This is the first attempt to write as much as possible .exe code.

  • Comments are not intended for extended discussion; conversation moved to chat . - Nick Volynkin

1 answer 1

  .model small ; тип данных? .data ; набор данных B dw 45 ; значения в десятичной системе, шестнадецитичные писались бы с h на конце C dw 10 ; переменные двубайтные - dw (word) D dw 1 result db ?,?,?,?,?,'$' ; место для результата, так как нам буден нужна ; человекочитаемая строка то она может состоять максимум из 5 байт данных ; (максимальное 2х байтное число 65535) и знак $ отмечающий конец печатаемой строки ; для функции 9 прерывания 21h .code ; сегмент кода mov ax, @data ; помещаем в регистр ax адрес сегмента памяти, где лежат наши данные mov ds, ax ; копируем значение из ax в регистр сегмента данных ; когда мы будем писать mov ax,B на самом деле будет подразумеваться ; mov ax,ds:[offset B], т.е. все переменные в коде адресуются относительно ; регистра ds и он должен содержать корректное значение ; mov ds,@data мы написать не могли, т.к. в ds нельзя заносить ; непосредственные значения, поэтому для пересылки мы пользовались ax mov ax, B ; ax=B sub ax, C ; ax=ax-C inc ax ; ax++ ; ---------- певод в десятичное ASCII MOV CX,0010 ;Фактор деления LEA SI,result+4 ;Адрес последнего выводимого символа С20: CMP AХ,0010 ;Значение меньше 10? JB С30 ; Да - выйти XOR DX,DX ;Очистить часть частного DIV CX ;Разделить на 10 OR DL,30H ;Делаем из байта 0-9 символ '0'-'9' MOV [SI],DL ;Записать ASCII-символ DEC SI ;Уменьшить адрес символа JMP С20 C30: OR AL,30H ;Превратить поcл. частное в символ MOV [SI],AL ;3аписать символ ;--------------------------------- mov ah, 09h ; ah-фунция прерывания 21h, 9=вывод на экран mov dx, si ; в dx помещаем адрес первого выводимого символа ; функция 9 21h требует адрес выводимой строки в ds:dx int 21h ; вызов прерывания функций DOS (21h) mov ah, 4ch ; ah-функция прерывания 21h, 4c=завершить программу int 21h ; вызов прерывания функций DOS (21h) end 

Useful links:

interrupt functions 21h

ASCII character table

  • Thank you so much, now it remains only to deal with all this. - Muscled Boy
  • @MuscledBoy Yes, and I highly recommend that you take this seriously and study the assembler and the underlying topics. Even if you never need to write anything else on it. Even if it goes beyond the current course of study. Because it gives a real understanding of machines, which greatly helps when working in any programming language - Mike