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

Объяснение кода листинга программы

  1. Переменная mas используется для хранения нескольких значений (1, 5, 10, 0, 0, 1, 0).
  2. Код использует сегментные регистры ds и cs для установки области данных и кода соответственно.
  3. Функция Start начинается с установки регистра ax в значение сегмента dseg.
  4. Затем регистр ds устанавливается в значение регистра ax.
  5. Регистр ax затем устанавливается в значение 230h.
  6. Следующий шаг - установка регистра si в смещение переменной mas.
  7. Регистр cx устанавливается в 7.
  8. Затем начинается цикл m, который продолжается до тех пор, пока значение в памяти по адресу, хранящемуся в регистре si, не станет ненулевым.
  9. Если значение в памяти по адресу, хранящемуся в регистре si, равно нулю, то выполняется переход к метке m1.
  10. Если значение в памяти по адресу, хранящемуся в регистре si, не равно нулю, то выполняется переход к метке exit.
  11. В блоке m1 выполняется увеличение значения регистра al на единицу, а затем увеличение значения регистра si на единицу.
  12. Цикл m1 продолжается до тех пор, пока значение регистра cx не станет равным нулю.
  13. Если значение регистра cx равно нулю, то выполняется переход к метке exit.
  14. Если значение регистра cx не равно нулю, то выполняется увеличение значения регистра al на единицу, а затем увеличение значения регистра si на единицу.
  15. В конце функции Start выполняется установка регистра dl в значение регистра al, а затем выполнение прерывания 21h.
  16. Затем выполняется установка значения регистра ax в 4c00h, а затем выполнение прерывания 21h.
  17. В конце программы выполняется установка значения регистра ax в 4c00h, а затем выполнение прерывания 21h.
  18. Значение регистра ax используется для возврата управления в вызывающую программу.
  19. Если в начале программы не было установлено значение регистра ds, то программа не сможет корректно работать.
  20. Если в начале программы не было установлено значение регистра cs, то программа не сможет корректно работать.

Оцени полезность:

15   голосов , оценка 4.2 из 5
Похожие ответы