мне часто надо переходить на новую строку для этого постоянно надо писать mov ah,2h mov dl,13 ;carriage return int 21h mov ah,2h mov dl,10 ; New line int 21h что бы этого не писать сделаем это где-то отдельно и будем туда прыгать, допустим так newline: mov ah,2h mov dl,13 ;carriage return int 21h mov ah,2h mov dl,10 ; New line int 21h как сделать так, что бы после выполнения этого куска кода. оно возвращало в место вызова, обычный RET в конце не помогает
хм.. действительно с retn все работает. тогда получается что при вызове ближних процессов лучше использовать retn, а при вызове дальних ret. Верно ?
kosha Инструкции ret не существует, есть retn, retf для near и far вызовов соответственно. ret (можно считать это макросом) преобразуется к одной из этих инструкций в зависимости от того, как определена процедура, в которой она используется. Если процедура определена как NEAR, будет retn, если как FAR, будет retf. Кроме того, при использовании ret к retn или retf в конце добавляется число, равное количеству байт, которые необходимо вытащить из стека после возврата потока управления на позицию после call. Это число равно размеру всех параметров, переданных в процедуру, в байтах. Код (Text): example proc near arg1:WORD, arg2:WORD, arg3:WORD ; ... call newline ; ... ret ; будет заменено на retn 6, так как процедура example идет с типом near, и передается 3 аргумента по 2 байта каждый newline: ; ... ret ; тоже будет заменено на retn 6, причины те же ; однако тут должно быть просто retn, так как вызов near и аргументы через стек в newline не передаются example endp Надеюсь поймете...