ORG 100H всегда необходим? - Assembler
Формулировка задачи:
Всем доброго времени суток,
У меня есть программа, которая задаёт массив и просматривает, сколько в нём нолей. Я написал с использованием точечной директивы tiny и всё было норм. Теперь я решил тот же код переложить на стандартные директивы сегментации.
Получилось так, что если я пишу org 100h, то в Dseg данные смещаются на 100h, но проход по массиву начинается всё равно от 0. Что я делаю не так? Если убрать org 100h программа завершается с правильным значением.
org 100h Dseg segment mas DB 1, 5, 10, 0, 0, 1, 0 Dseg ends Cseg segment Start: assume ds:dseg, cs:cseg mov si,100h mov cx,7 m: cmp ds:mas[si],0 je m1 inc si loop m jmp exit m1: cmp cx,00 je exit inc al inc si dec cx jmp m exit: mov dl,al mov ah,02 add dl,30h int 21h mov ax,4c00h int 21h cseg ends end start
Решение задачи: «ORG 100H всегда необходим?»
textual
Листинг программы
Dseg segment mas DB 1, 5, 10, 0, 0, 1, 0 Dseg ends Cseg segment assume ds:dseg, cs:cseg Start: mov ax,dseg mov ds,ax mov ax,230h mov si,offset mas mov cx,7 m: cmp [si],0 je m1 inc si loop m jmp exit m1: jcxz exit inc al inc si loop m exit: mov dl,al int 21h mov ax,4c00h int 21h cseg ends end start
Объяснение кода листинга программы
- Переменная
mas
используется для хранения нескольких значений (1, 5, 10, 0, 0, 1, 0). - Код использует сегментные регистры
ds
иcs
для установки области данных и кода соответственно. - Функция
Start
начинается с установки регистраax
в значение сегментаdseg
. - Затем регистр
ds
устанавливается в значение регистраax
. - Регистр
ax
затем устанавливается в значение 230h. - Следующий шаг - установка регистра
si
в смещение переменнойmas
. - Регистр
cx
устанавливается в 7. - Затем начинается цикл
m
, который продолжается до тех пор, пока значение в памяти по адресу, хранящемуся в регистреsi
, не станет ненулевым. - Если значение в памяти по адресу, хранящемуся в регистре
si
, равно нулю, то выполняется переход к меткеm1
. - Если значение в памяти по адресу, хранящемуся в регистре
si
, не равно нулю, то выполняется переход к меткеexit
. - В блоке
m1
выполняется увеличение значения регистраal
на единицу, а затем увеличение значения регистраsi
на единицу. - Цикл
m1
продолжается до тех пор, пока значение регистраcx
не станет равным нулю. - Если значение регистра
cx
равно нулю, то выполняется переход к меткеexit
. - Если значение регистра
cx
не равно нулю, то выполняется увеличение значения регистраal
на единицу, а затем увеличение значения регистраsi
на единицу. - В конце функции
Start
выполняется установка регистраdl
в значение регистраal
, а затем выполнение прерывания 21h. - Затем выполняется установка значения регистра
ax
в 4c00h, а затем выполнение прерывания 21h. - В конце программы выполняется установка значения регистра
ax
в 4c00h, а затем выполнение прерывания 21h. - Значение регистра
ax
используется для возврата управления в вызывающую программу. - Если в начале программы не было установлено значение регистра
ds
, то программа не сможет корректно работать. - Если в начале программы не было установлено значение регистра
cs
, то программа не сможет корректно работать.