2016-10-29 2 views
0

Я пытаюсь отобразить сообщение несколько раз.отображение сообщения много раз в языке ассемблера

Я использовал NASM, и я использовал эту программу:

MOV cx, 1 
    mov ax, 10 
re: 
    CMP ax, cx 
    JS fin 
    mov dx, texte 
    INC cx 
    JMP re 
fin: 
    Int 21h 
    texte: db 'Hello, World !!' 
+0

В чем проблема? (также не похоже на то, что вы инициализируете 'ax') – obe

+0

Проблема tnis-код не отображает сообщение Hello, World !! 10 раз –

ответ

1

пару более вещей:

  • для INT21h выполнить вывод, что вам нужно установить AH до 9. Вы уже используете AX для хранения предела цикла; вам придется использовать какой-то другой регистр (BX, SI, DI в настоящее время не используются) или жестко закодированный лимит. Кроме того, функция int21h 9 изменяет значение AL на выходе - еще одна причина не использовать AX.
  • Строка должна быть прервана символом $. Это то, что ожидает int21h/9, а не соглашение ассемблера в целом.
  • И, как сказал obe, вам нужна команда int 21h раньше, а не после строки «jmp re».
  • На этикетке «fin» вы можете выйти из программы. Последовательность для этого: «mov ah, 4ch/int 21h».
+0

Или подсчитайте CX с 10, вместо того, чтобы использовать два регистра для цикла от 1 до 10. Или поставьте 10 в качестве непосредственного операнда для CMP. SI и DI также не используются, IDK, почему вы упомянули BX, но не их. –

+0

Много способов сделать это. Команда «LOOP re», вероятно, будет самой простой. –

+0

За исключением того, что [LOOP медленный] (http://stackoverflow.com/questions/35742570/why-is-the-loop-instruction-slow-couldnt-intel-have-implemented-it- эффективно), а не хороший привычка учить новичков. Они не найдут реального кода, который использует его при просмотре вывода компилятора, поэтому может также научиться создавать циклы с cmp/jcc (или dec/jnz). Проще просто не упоминать LOOP в первую очередь, так как это не полезно вне оптимизации для размера кода. –

2

В настоящее время, вы вызовете int 21h только в нижней части. Попробуйте переместить его в петлю.

Кроме того, прошло очень много времени с тех пор, как я в последний раз делал что-то в сборке, но вам, вероятно, также нужно подготовить некоторые регистры, чтобы определить, что будет делать int 21h. Смотрите подробнее здесь: http://spike.scu.edu.au/~barry/interrupts.html#ah09

+0

Я меняю его, и я использовал команду nasm, но сообщение не отображается. –

+1

Пожалуйста, не изменяйте код в своем вопросе. Вместо этого добавьте обновленный код ниже. – fuz

Смежные вопросы