лів.
Дана матриця цілих байтових величин, розміром 4 * 5, необхідно підрахувати кількість нулів і замінити їх числом 0FFh. Під стек відведемо 256 байтів, програму оформимо як дві послідовні процедури: зовнішня (FAR) - це зв'язок з ОС, внутрішня (NEAR) - рішення поставленого завдання.
1. title prim.asm
2. page, 132
3. ; сегмент стека
4. Sseg segment para stack stack
. db 256 dup (?)
. Sseg ends
. ; сегмент даних
. Dseg segment para public data ??p>
. Dan db 0,2,5,0,, 91; адресу першого елемента масиву Dan
10. db 4,0,0,15,47;
11. db 24,15,0,9,55
12. db 1,7,12,0,4
13. Dseg ends
. ; сегмент кодів
15. Cseg segment para public code
16. essume cs: cseg, ds: dseg, ss: sseg
. start proc far
. push DS; для зв'язку
. push AX; з ОС
20. mov BX, Dseg; завантаження адреси сегмента даних
21. mov DS, BX; в регістр DS
22. call main
. ret
. start endp
. main proc near
. mov BX, offset Dan
. mov DL, 0; лічильник нулів в матриці
28. mov CX, 4; кількість повторень зовнішнього циклу
29. nz1: push CX
. mov SI, 0
. mov CX, 5; кількість повторень внутрішнього циклу
32. nz2: push CX
. cmp byte ptr [BX + SI], 0
. jne mz
. mov byte ptr [BX + SI], 0FFh
. inc DL
. mz: inc SI
38. pop CX
39. kz2: loop nz2
40. add BX, 5; перехід до наступного рядка матриці
41. pop CX
42. kz1: loop nz1
43. add DL, 0; висновок на екран
44. mov AH, 6; кількості нулів
45. int 21h
46. ret
. main endp
. Sseg ends
. end start
Завдання вирішена за допомогою двох вкладених циклів, у внутрішньому здійснюється перегляд елементів поточного рядка (32-39), збільшення лічильника нулів і пересилання константи 0FFh в байт, що містить нуль. У зовнішньому циклі здійснюється перехід до наступного рядка очищенням регістра SI (рядок 30) і збільшенням регістра BX на кількість елементів у рядку (40).
Фізично остання команда програми (49) як параметр вказує мітку команди, з якою необхідно починати виконання програми.
Директива title задає заголовок кожній сторінці лістингу, заголовок може містити до 60 символів.
Директива page встановлює кількість рядків на сторінці лістингу - 1-й ...