Не понимаю вывод программы сборки

Это пример кода на языке ассемблера для 8086 для печати строки в обратном порядке.

.model small
.STACK 100H
.DATA
MSG DB 'HELLO!$'

.CODE
MOV CL,0

 AGAIN:
 MOV DL,DS:[SI]
; MOV AH,2
; INT 21H
 INC CL
 INC SI
 CMP DL,'$'
 JNE AGAIN
 DEC SI
 DEC CL

 REV:
   DEC SI
   MOV DL,DS:[SI]
   MOV AH,2
   INT 21H
   DEC CL
   CMP CL,0
   JNE REV

 .EXIT
  END

Это вывод! ОЛЛЕХ. Но если я напишу

  MOV AH,2
  INT 21H

на уровне СНОВА ниже MOV DL, DS: [SI]. Я думаю, что ответ должен быть HELLO !! OLLEH, но он показывает символ '=' и предыдущий вывод. Почему это происходит?


person Alimur Razi Rana    schedule 28.12.2016    source источник
comment
Это скорее совпадение, что код вообще работает, так как вы никогда не беспокоитесь об инициализации SI.   -  person Cody Gray    schedule 28.12.2016
comment
emu8086 имеет встроенный отладчик. Вы должны иметь возможность проверить, какая память читается, какой контент читается в каждом цикле и т. Д. Можно с уверенностью сказать, что этот новый int 21h делает то, что должен, выводит DL char ... не то, что вы ожидали.   -  person Ped7g    schedule 28.12.2016


Ответы (1)


Я думаю, что ответ должен быть ПРИВЕТ !! ОЛЛЕХ

Исправление. Поскольку вы проверяете наличие символа «$» только после вывода с помощью функции DOS 02h, на экране должно отображаться:

HELLO!$!OLLEH

Просто с DOS-функцией 09h невозможно написать символ "$".


Можно получить полуправильные результаты, потому что emu8086 инициализировал регистры каким-то образом по умолчанию, но лучше всего настроить регистры вручную перед их использованием:

.CODE
 mov ax, DATA
 mov ds, ax
 mov si, offset MSG
 MOV CL, 0
AGAIN:
 MOV DL, [SI]
 MOV AH, 2
 INT 21H
person Fifoernik    schedule 29.12.2016