Мета: вивчити способи задання констант та змінних в Асемблері та набути навиків використання арифметичних команд над даними різного розміру.
Заданий вираз:
X=A2*B1+C4/(K-E1*F1) К=A77627h
Таким чином, в сегменті даних слід відвести місце не лише під вхідні дані та константу, а й під проміжні та остаточні результати, відповідних розмірностей.
Зауважимо, що оскільки значення К є трибайтним, а арифметичні дії можуть виконуватися над дво- або чотирибайтними даним, то цю константу варто розбити на дві двобайтні частини – молодшу (7627h), та старшу (00A7h). Це полегшить звертання та оперування зі значенням константи К, хоча такий підхід не є обов’язковим. Такі ж міркування стосуються проміжних результатів та остаточного результату X.
Отже, сегмент даних може буде описаний таким чином:
.MODEL SMALL
.STACK 100h
.DATA
K_low EQU 7627h
K_high EQU 00A7h
A dw 2h ;=2
B db 1h ;=1
C dd B71B00h ;=12000000
E db 14h ;=20
F db 3Ch ;=60
Temp1 dw 00h,00h
Temp2 dw 0000h
Temp3 dw 00h,00h
Temp4 dw 00h,00h
X dw 00h,00h
Опис розділених змінних можна виконувати під різними іменами (наприклад K_low та K_high), або під одним іменем як різні елементи даних (тобто через кому, наприклад Temp1). В останньому випадку, звертання до молодшої частини буде відбуватися по імені, а до старшої - ім’я +зміщення (Temp1 – два молодші байти, Temp1+2 - два старші байти).
Всі невідомі значення заповнюємо нуля, щоб уникнути непередбачуваних результатів..
Наступні обчислення виконуємо за допомогою операцій DIV, MUL, ADD, ADC, SUB,SBB згідно з їх форматами та розмірністю даних.
Повний текст програми, що виконує дані обчислення приведений нижче. Остаточний результат обчислення виразу буде знаходитися в пам’яті за адресою X.
.MODEL SMALL
.STACK 100h
.DATA
K_low EQU 7627h
K_high EQU 00A7h
A dw 2h ;=2
B db 1h ;=1
C dd B71B00h ;=12000000
E db 14h ;=20
F db 3Ch ;=60
Temp1 dw 00h,00h
Temp2 dw 0000h
Temp3 dw 00h,00h
Temp4 dw 00h,00h
X dw 00h,00h
.CODE
mov ax,@data
mov ds,ax
mov ax,0
mov al,B
mul A
mov Temp1,ax;=0002
mov Temp1+2,dx;=0000
mov ax,0
mov al,E
mul F
mov Temp2,ax ;=04B0
mov dx,K_high
mov ax,K_low2
mov bx,Temp2
sub ax,bx
sbb dx,0
mov Temp3,ax;=7177
mov Temp3+2,dx;=00A7
mov ax,word ptr[C]
mov dx,word ptr[C+2]
div Temp3
mov Temp4,ax
mov ax,Temp4
add Temp1,ax
adc Temp1+2,0
mov X,ax
mov X+2,dx
mov ah,4Ch
int 21h
end