Консультация № 189590
16.06.2016, 18:58
0.00 руб.
0 3 1
Здравствуйте! Прошу помощи в следующем вопросе:
учил ассемблер и заметил что в одном уроке на fasm завершение программы пишут (на сайте)
[code lang=asm]
mov ax, 4c00h
int 21h[/code]
а в masm (в книге) уже
[code lang=asm]int 20h[/code]
это разница в языке программирования (разновидность языка ассемблер) или компиляторов?
в обоих случаях это .com файлы запускал под DOS, вот примеры
fasm
[code lang=asm]use16 ;Генерировать 16-битный код
org 100h ;Программа начинается с адреса 100h

mov ax,255 ;Поместить 255 в регистр AX
inc ax ;Увеличить содержимое AX на 1
nop ;Эта команда ничего не делает
mov bx,ax ;Поместить в BX содержимое AX

mov ax,4C00h ;\
int 21h ;/ Завершение программы
[/code]

masm
[code lang=asm]
CSEG segment
org 100h
Begin:
mov ah,9
mov dx,offset Message
int 21h
;-----------
int 20h
;-----------
Message db 'Hello, world!$'
CSEG ends
end Begin
[/code]

Обсуждение

давно
Старший Модератор
31795
6196
16.06.2016, 19:04
общий
Адресаты:
[code lang=asm h=50]mov ax, 4c00h
int 21h[/code]
Может использоватся для завершения программ типа ЕХЕ-файлов, в редких случаях СОМ-файлов. СОМ-файлы завершаются как Int 20h так и RET
.
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

давно
Посетитель
7438
7205
16.06.2016, 19:44
общий
17.06.2016, 19:11
Адресаты:
это разница в языке программирования (разновидность языка ассемблер) или компиляторов?
Нет, это два способа завершения программы.
Код:
mov ax, 4c00h
int 21h
Это более универсальный способ. С его помощью можно завершать любую программу, как EXE, так и COM
Кроме того, в AL можно задать код возврата (который можно проанализировать в BAT-файле по ERRORLEVEL)
Код:
int 20h
Это более упрощенный выход. У него есть ограничение: на момент вызова в CS должен быть адрес сегмента PSP.
Но такому условию удовлетворяют практически все COM-программы. Поэтому чаще всего в них и используется.
Код:
ret
Эта возможность, упомянутая Константином Николаевичем, сводится к выходу по int 20h
Т.к. команда RET извлечет из вершины стека смещение-адрес возврата (а там обычно 0) и передаст туда управление.
А по смещению 0 лежит PSP, в первых 2 байтах которого записана команда int 20h, по которой программа и завершается :)
Надо сказать, что это не совсем корректно... Вполне может статься, что нуля в вершине стека может и не оказаться...
Но в большинстве случаев работает...
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
давно
Посетитель
7438
7205
18.06.2016, 13:45
общий
это ответ
Здравствуйте, arti-779!
это разница в языке программирования (разновидность языка ассемблер) или компиляторов?
Нет, это два способа завершения программы.
Код:
mov ax, 4c00h
int 21h
Это более универсальный способ. С его помощью можно завершать любую программу, как EXE, так и COM
Кроме того, в AL можно задать код возврата (который можно проанализировать в BAT-файле по ERRORLEVEL)
Код:
int 20h
Это более упрощенный выход. У него есть ограничение: на момент вызова в CS должен быть адрес сегмента PSP.
Но такому условию удовлетворяют практически все COM-программы. Поэтому чаще всего в них и используется.
Код:
ret
Эта возможность, упомянутая в мини-форуме Константином Николаевичем, сводится к выходу по int 20h
Т.к. команда RET извлечет из вершины стека смещение-адрес возврата (а там обычно 0) и передаст туда управление.
А по смещению 0 лежит PSP, в первых 2 байтах которого записана команда int 20h, по которой программа и завершается :)
Надо сказать, что это не совсем корректно... Вполне может статься, что нуля в вершине стека может и не оказаться...
Но в большинстве случаев работает...
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
Форма ответа