2016-12-28 21 views
1

Это пример кода на языке ассемблера для 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 

Это выход! OLLEH. Но если я напишу

MOV AH,2 
    INT 21H 

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

+3

Это скорее совпадение, что код работает вообще, так как вы никогда не потрудитесь инициализировать 'SI'. –

+0

emu8086 есть отладчик встроенный. Вы должны быть в состоянии проверить, какая память читается, какой контент читается в каждом цикле и т. Д. Можно с уверенностью сказать, что новый 'int 21h' делает то, что должен, выводит символ' DL' ... вещь вокруг, вероятно, не то, что вы ожидали. – Ped7g

ответ

1

Я думаю, что ответ должен быть ЗДРАВСТВУЙТЕ !! OLLEH

коррекция. Так как вы проверяете для символа «$» только после выводимого с функцией 02h DOS, экран должен показать:

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