ться в ax: cmp di, 1; якщо встановлено прапор, тоii3ax; робимо число негативним: retdb incorrect number $ db 6,7 Dup (?) endp
Підпрограма на мові програмування Асемблер IBM PC
Процедура виведення
OutInt proc near; ===== Процедура виводаax, ax; перевіряємо число на знак.oi1cx, ax; eсли воно негативне, виведемо мінус і
; залишимо його модульah, 02hdl, - 21hax, cxax: xor cx, cx; кількість цифр будемо тримати в CXbx, 10; підставу сс. 10 для десятеричной і т.п .: xor dx, dxbx; ділимо число на підставу сс, в залишку
; виходить остання ціфраdx; відразу виводити її не можна, тому збережемо
; її в стекеcx
; а з приватним повторюємо те ж саме, відокремлюючи
; від нього очереднуюax, ax; цифру справа, поки не залишиться нуль, що
; означає, що дальшеoi2; зліва лише нулі
; ======== Висновок ========= ah, 02h: pop dxdl, 0 raquo ;; витягаємо чергову цифру, переводимо її в
; символ і виводім21hoi3; повторимо рівно стільки разів, скільки цифр
; насчіталіendp
Блок схема
3.3 Програма на мові програмування Асемблер IBM PC
. model small
. stack 200h
.datadb? db? db 4 dup (?,?,?,?) dw? dw? dw? dw 8db 0123456789ABCDEF db 4 DUP (20h), 13,10, $ db laquo ; Resultat , 13,10, $
.codeprocax, ax; Перевіряємо число на знак.oi1
; Якщо воно негативне, виведемо
; мінус і залишимо його модуль.cx, axah, 02hdl, - 21hax, cxax
; Кількість цифр будемо тримати в CX: cx, cxbx, 10; підставу сс. 10 для десятеричной і т.п.: dx, dxbx
; Ділимо число на підставу сс.
; У залишку виходить остання цифра.
; Відразу виводити її не можна,
; тому збережемо її в стеке.dxcx
; А з приватним повторюємо те ж саме,
; відокремлюючи від нього чергову
; цифру справа, поки не залишиться нуль,
; що означає, що далі зліва тільки нулі.ax, axoi2
; Тепер приступимо до виводу.ah, 02h
oi3: dx
; Витягуємо чергову цифру,
; переводимо її в символ і виводім.dl, 0 21h
; Повторимо рівно стільки разів,
; скільки цифр насчіталі.oi3
retendpprocah, 0ah
xor di, didx, offset buff; аддрес буфера21h; приймаємо строкуdl, 0ahah, 0221h; виводимо перекладу рядка
; обробляємо вміст буфераsi, offset buff + 2; беремо аддрес початку строкіbyte ptr [si], - raquo ;; якщо перший символ мінусii1di, 1; встановлюємо флагsi; і пропускаємо його: ax, axbx, 10; підставу СC: cl, [si]; беремо символ з буфераcl, 0dh; перевіряємо чи не останній онendin
; якщо символ не останній, то
; перевіряємо його на правільностьcl, 0 raquo ;; коли введено неправильний символ lt; 0ercl, 9 raquo ;; коли введено неправильний символ gt; 9ercl, 0 raquo ;; робимо з символу чіслоbx; множимо на 10ax, cx; додаємо до остальнимsi; покажчик на наступний сімволii2; повторюємо :; якщо була помилка, то виводимо
; повідомлення про це і виходимо
mov dx, offset errorah, 0921h20h
; всі символи з буфера
; оброблені число знаходиться в ax: di, 1; якщо встановлено прапор, тоii3ax; робимо число негативним: db incorrect number $ db 6,7 Dup (?) endpproc near; --------------------- eAl, 2BL, cBLe, AXAX, 0BX, 06; ???
PP1 endpproc near; f
mov AX, 0AL, aALDX, 1AX, DXf, AXAX, 0DX, 06; ??? endp: ax,Datads, axInputInt; введення числа АA, ALInputInt; введення числа СC, ALSI, 0SI: call InputIntSId [SI], ALSI, 2SI, tSIl1
call PP1; виклик п п 1
call PP2; виклик п п 2SI, 0CX, 4AX, AXy, AX: mov DX, 0AH, 0CL, 0AL, d [SI]
mov BL, ALAX, 0m2CL, 1AL, BL
neg AL: mov DL, 4DL
cbwCL, 0m3AL: mov BX, e
sub BX, AX
cbwAX, BX
mov AX, BXBX, f
idiv BX; AL=AL/fBX, AXAX, BX
cwdDX, yAX, DXy, AXSI, 2SI, tforCX, 0
mov AX, yDX, AX; DX:=AX
call OutIntAX, 4c00h21hbegin
Програма на мові програмування Асемблер IBM PC
Блок схема
4. Тестування та налагодження
Вхідні данниеСі Int (десяткова СС) Сі float (десяткова СС) Асемблер УМ (шістнадцяткова СС) Асемблер IBM PC (десяткова СС) a=2 c=20 d [0]=20 d [1] =12 d [2]=4 d [3]=- 16 29 31 1D 29a=3 c=30 d [0]=51 d [1]=41 d [2]=24 d [3]=- 21 20 21.625 14 20a=2 c=20 d [0]=20 d [1]=14 d [2]=4 d [3]=16 28 29.3 1C 28
Переведемо результат роботи Асемблера УМ в д...