Форум программистов, компьютерный форум, киберфорум
Наши страницы
Assembler, MASM, TASM
Войти
Регистрация
Восстановить пароль
 
Jin X
❗❗ RTFM 👈
3998 / 1142 / 151
Регистрация: 14.12.2014
Сообщений: 2,284
Записей в блоге: 4
Завершенные тесты: 2
#1

Прыжок внутрь процедуры (masm) - Assembler

21.12.2016, 21:32. Просмотров 927. Ответов 16
Метки нет (Все метки)

В TASM можно без проблем прыгнуть внутрь процедуры
Assembler
1
2
3
4
5
6
7
jmp lab
 
Hello proc
  nop
 lab:
  nop
Hello endp
В MASM такой фокус не прокатит, т.к. все метки внутри процедуры считаются локальными.
Менять объявление процедуры на просто метку не хочется:
Assembler
1
2
3
4
5
6
jmp lab
 
Hello:
  nop
 lab:
  nop
Как можно это обойти?

Добавлено через 1 минуту
Можно извратиться, конечно, и написать так:
Assembler
1
2
3
4
5
6
7
8
jmp lab
 
Hello proc
  nop
 lab proc
 lab endp
  nop
Hello endp
но это как-то не очень красиво всё равно...
http://www.cyberforum.ru/assembler/thread824641.html
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.12.2016, 21:32
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Прыжок внутрь процедуры (masm) (Assembler):

Как зайти внутрь прерываний
Можно ли TurboDebagger-ом зайти внутрь прерываний(пишу программку для...

masm
помогите решить пожалуйста (masm) С помощью клавиш курсора осуществляется...

MASM db
Только начал изучать асм, а лабы уже надо сдавать... никак не могу найти инфы....

MASM
добрый вечер всем.. мне вот задали задание пример решить на языке...

MASM
Скачал MASM ассамблер, но сомневаюсь что это то что надо.

16
Hikari
Хитрая блондиночка $)
1451 / 960 / 399
Регистрация: 21.12.2015
Сообщений: 3,785
21.12.2016, 21:33 #2
Вытяни оставшийся под меткой код в отдельную процедуру, и вызывай ее из двух мест как нужно.
0
ФедосеевПавел
Модератор
3412 / 1909 / 815
Регистрация: 01.02.2015
Сообщений: 6,449
21.12.2016, 23:47 #3
Лучший ответ Сообщение было отмечено Jin X как решение

Решение

EXTERNDEF
В обоих местах - и в процедуре с меткой и в месте вызова. Плюс сама метка с двумя двоеточиями.

Пример - компиляция masm32 (masm 6.14.8444)
Код
ml.exe /c /Fl /Sa %AsmSourceName%.asm
link16 %AsmSourceName%.obj,,,,,
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
.model small
.stack 100h
.data
        msg1    db      'Simple', 13, 10, '$'
        msg2    db      'Catch!', 13, 10, '$'
.code
main    proc
        mov     ax,     @data
        mov     ds,     ax
 
        call    proc1
        call    proc2
 
        mov     ax,     4C00h
        int     21h
main    endp
 
proc1   proc
EXTERNDEF codelabel:NEAR
        lea     dx,     msg1
codelabel::
        mov     ah,     9
        int     21h
        ret
proc1   endp
 
proc2   proc
EXTERNDEF codelabel:NEAR
        lea     dx,     msg2
        jmp     codelabel
        ret
proc2   endp
 
end     main
Добавлено через 5 минут
--------------------------------
PUBLIC
Метка с двумя двоеточиями
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
.model small
.stack 100h
.data
    msg1    db  'Simple', 13, 10, '$'
    msg2    db  'Catch!', 13, 10, '$'
.code
main    proc
    mov ax,     @data
    mov ds, ax
 
    call    proc1
    call    proc2
 
    mov ax, 4C00h
    int 21h
main    endp
 
proc1   proc
public codelabel
    lea dx, msg1
codelabel::
    mov ah, 9
    int 21h
    ret
proc1   endp
 
proc2   proc
    lea dx, msg2
    jmp codelabel
    ret
proc2   endp
 
end main
2
Jin X
❗❗ RTFM 👈
3998 / 1142 / 151
Регистрация: 14.12.2014
Сообщений: 2,284
Записей в блоге: 4
Завершенные тесты: 2
22.12.2016, 00:26  [ТС] #4
Hikari, ну это что-то типа того, что я писал выше...
Assembler
1
2
 lab proc
 lab endp
Добавлено через 3 минуты
ФедосеевПавел, без public'ов просто работает с 2 двоеточиями
Спасибо!
1
ФедосеевПавел
Модератор
3412 / 1909 / 815
Регистрация: 01.02.2015
Сообщений: 6,449
22.12.2016, 00:28 #5
PUBLIC+CodeLable::

Добавлено через 53 секунды
Без PUBLIC не пробовал. Теперь буду знать.
0
KyberMax
Terminator of naked apes
827 / 134 / 34
Регистрация: 13.02.2015
Сообщений: 328
22.12.2016, 16:49 #6
Цитата Сообщение от Jin X Посмотреть сообщение
В TASM можно без проблем прыгнуть внутрь процедуры
Цитата Сообщение от Jin X Посмотреть сообщение
В MASM такой фокус не прокатит, т.к. все метки внутри процедуры считаются локальными.
В ранних версиях Масма все метки тоже были глобальными (но потом эту "фичу" решили убрать, сделав метки внутри процедуры локальными - видимо, осознали, что это поощряет погромистов к написанию говнокода, например ;о)

Впрочем, возможность вернуть эту прелесть назад оставили (OPTION NOSCOPED, например ;о) Копипаста из доки:

"The SCOPED option causes a label (defined with the "label:" syntax) to be local to the procedure in which it is defined. Labels defined with the LABEL directive or the "label::" syntax are not affected by this option.

Using NOSCOPED will cause all labels to be global to the module. SCOPED is the default. The NOSCOPED option is enabled with the M510 option, if the .MODEL directive is used without a language type specification. Specifying .MODEL with a language type enables OPTION SCOPED."

Цитата Сообщение от Jin X Посмотреть сообщение
Можно извратиться, конечно, и написать так
Можно-то оно, канешни, можно, но надо ли? Вот и Hikari благоразумно призывает тебя придерживаться чуть более безопасного стиля, например ;о):

Цитата Сообщение от Hikari Посмотреть сообщение
Вытяни оставшийся под меткой код в отдельную процедуру, и вызывай ее из двух мест как нужно.
1
Jin X
❗❗ RTFM 👈
3998 / 1142 / 151
Регистрация: 14.12.2014
Сообщений: 2,284
Записей в блоге: 4
Завершенные тесты: 2
22.12.2016, 19:22  [ТС] #7
Цитата Сообщение от KyberMax Посмотреть сообщение
Можно-то оно, канешни, можно, но надо ли? Вот и Hikari благоразумно призывает тебя придерживаться чуть более безопасного стиля
Чем это лучше использования меток с двойным двоеточием?
0
KyberMax
Terminator of naked apes
827 / 134 / 34
Регистрация: 13.02.2015
Сообщений: 328
29.12.2016, 23:09 #8
Цитата Сообщение от Jin X Посмотреть сообщение
Чем это лучше использования меток с двойным двоеточием?
Тем, что процедура - это высокоуровневая надстройка над подпрограммой, генерирующая прозрачные для погромиста т.н. пролог и эпилог, где невозбранно манипулирует со стеком (что в общем случае влечёт необходимость постоянного отслеживания и ручной синхронизации фрагментов кода в процедуре и в месте прыжка, например ;о)
0
Jin X
❗❗ RTFM 👈
3998 / 1142 / 151
Регистрация: 14.12.2014
Сообщений: 2,284
Записей в блоге: 4
Завершенные тесты: 2
30.12.2016, 00:25  [ТС] #9
Цитата Сообщение от KyberMax Посмотреть сообщение
генерирующая прозрачные для погромиста т.н. пролог и эпилог, где невозбранно манипулирует со стеком
Тогда я скажу, что надобность в этих прологах и эпилогах зависит от конкретного случая.
p.s. Да и какие прологи и эпилоги генерирует proc без указания параметров (аргументов) и локальных переменных процедуры? Никакие
0
Kukuxumushu
752 / 475 / 89
Регистрация: 13.06.2015
Сообщений: 1,628
Завершенные тесты: 2
30.12.2016, 02:19 #10
После перехода на FASM подобные вопросы перестали мучить - там вообще нет отдельно оформленных процедур, как и предполагает Истинная Красота Программирования на Ассемблере. Поэтому предлагаю не мучиться и отказаться от использования этих идиотских конструкций и в остальных диалектах.
1
KyberMax
Terminator of naked apes
827 / 134 / 34
Регистрация: 13.02.2015
Сообщений: 328
30.12.2016, 11:33 #11
Цитата Сообщение от Jin X Посмотреть сообщение
Тогда я скажу, что надобность в этих прологах и эпилогах зависит от конкретного случая.
Отсутствие пролога/эпилога в PROC - всего лишь частный случай (сама эта фича придумана для удобства работы с параметрами и локальными переменными, например ;о) В общем же случае (о чём сказано выше ;о) придётся постоянно отслеживать и ручками править код (что расово стилистически неверно чуть более чем полностью, например ;о)

Цитата Сообщение от Jin X Посмотреть сообщение
p.s. Да и какие прологи и эпилоги генерирует proc без указания параметров (аргументов) и локальных переменных процедуры? Никакие
Зойчем тогда вообще оформлять подпрограммы как процедуры (для путаницы, например ;о)?

Цитата Сообщение от Kukuxumushu Посмотреть сообщение
После перехода на FASM подобные вопросы перестали мучить - там вообще нет отдельно оформленных процедур
Причём здесь FASM, однако (на MASM'е тоже можно кодить без использования высокоуровневых фич, например ;о)

Цитата Сообщение от Kukuxumushu Посмотреть сообщение
предлагаю не мучиться и отказаться от использования этих идиотских конструкций и в остальных диалектах.
В FASM'е есть макросы, реализующие и PROC, и INVOKE, и пр. HL (загляни как-нибудь в директории FASM'а EXAMPLES и INCLUDE - удивишься, например ;о) Хочешь сказать, что эти "идиотские конструкции" писали идиоты? ;о)
2
Kukuxumushu
752 / 475 / 89
Регистрация: 13.06.2015
Сообщений: 1,628
Завершенные тесты: 2
30.12.2016, 13:11 #12
Цитата Сообщение от KyberMax Посмотреть сообщение
Причём здесь FASM, однако (на MASM'е тоже можно кодить без использования высокоуровневых фич, например ;о)
Что я и пытаюсь донести. Все эти proc-endp - это "вот смотрите все - это не просто какой-то кусок кода, это процедура!!". Только компилятору на это до лампочки, и бинарник от такого "высокоуровневого" окаймления никак не изменится.
0
KyberMax
Terminator of naked apes
827 / 134 / 34
Регистрация: 13.02.2015
Сообщений: 328
30.12.2016, 14:56 #13
Kukuxumushu,
Цитата Сообщение от Kukuxumushu Посмотреть сообщение
Что я и пытаюсь донести. Все эти proc-endp - это "вот смотрите все - это не просто какой-то кусок кода, это процедура!!".
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
;
test1 PROC
      RET
test1 ENDP
;
test2 PROC par1:Word
      MOV   AX, par1
      RET
test2 ENDP
;
test3 PROC par1:Word
LOCAL loc1:Word
      MOV   AX, par1
      MOV   AX, loc1
      RET
test3 ENDP
;
Цитата Сообщение от Kukuxumushu Посмотреть сообщение
Только компилятору на это до лампочки, и бинарник от такого "высокоуровневого" окаймления никак не изменится.
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
                        ;
 01A2                   test1 PROC
 01A2  C3                     RET
 01A3                   test1 ENDP
                        ;
 01A3                   test2 PROC par1:Word
 01A3  55              *      push   bp
 01A4  8B EC           *      mov    bp, sp
 01A6  8B 46 04               MOV   AX, par1
                              RET
 01A9  5D              *      pop    bp
 01AA  C2 0002         *      ret    00002h
 01AD                   test2 ENDP
                        ;
 01AD                   test3 PROC par1:Word
                        LOCAL loc1:Word
 01AD  55              *      push   bp
 01AE  8B EC           *      mov    bp, sp
 01B0  83 C4 FE        *      add    sp, 0FFFEh
 01B3  8B 46 04               MOV   AX, par1
 01B6  8B 46 FE               MOV   AX, loc1
                              RET
 01B9  8B E5           *      mov    sp, bp
 01BB  5D              *      pop    bp
 01BC  C2 0002         *      ret    00002h
 01BF                   test3 ENDP
                        ;
Оформление подпрограммы как процедуры просто удобно (потому хотя бы, что именно компилятор автоматически считает смещения параметров и локальных переменных, например ;о)
1
Jin X
❗❗ RTFM 👈
3998 / 1142 / 151
Регистрация: 14.12.2014
Сообщений: 2,284
Записей в блоге: 4
Завершенные тесты: 2
01.01.2017, 23:23  [ТС] #14
Цитата Сообщение от KyberMax Посмотреть сообщение
Оформление подпрограммы как процедуры просто удобно (потому хотя бы, что именно компилятор автоматически считает смещения параметров и локальных переменных, например ;о)
Цитата Сообщение от KyberMax Посмотреть сообщение
Отсутствие пролога/эпилога в PROC - всего лишь частный случай (сама эта фича придумана для удобства работы с параметрами и локальными переменными, например ;о) В общем же случае (о чём сказано выше ;о) придётся постоянно отслеживать и ручками править код
Суть фичи понятна и так. Но что значит "в общем случае"? Каждый случай частный...
Зачем мне оформлять ссылку внутри процедуры как отдельную процедуру? Зачем мне "прозрачные для погромиста т.н. пролог и эпилог, где невозбранно манипулирует со стеком", если это ссылка внутри процедуру, в которую я прыгаю из другой процедуры, если обе процедуры без параметров?
Я таким образом наоборот могу внести только путаницу в код, сделав из 2-х процедур 3 (псевдопроцедуры)...
0
Constantin Cat
1628 / 940 / 356
Регистрация: 28.02.2015
Сообщений: 2,185
Завершенные тесты: 1
03.01.2017, 18:27 #15
Jin X, Kukuxumushu,
Вы наверное забыли, что у PROC есть ещё куча полезных параметров:
USES регистры - компилятор САМ, без Вашего участия раставит нужные PUSH и POP в начале и в конце программы. И не нужно парится в какой последовательности они сохранялись.
Язык - в соответсвии с выбраным языком программирования или моделью передачи параметров будет сгенерированный код пролога-эпилога, снова без Вашего участия. Заметьте только заменив параметр, взависимости от того куда(ЯВУ) Вы этот код засунете как вставку, будет сгенерированный нужный код.


Если говорить серьезно, то для учебных программ в сотню строчек она не нужна, как и комметарии, т.к. вроде весь код в голове, а вот когда пишеш ручками километровый код ассемблера, без логического оформления подпрограмм поиск ошибки занимает много времени. Аналогично и с комментами - через год вспомнить, что делают эти 100 строчек нужно несколько больше времени, чем прочитать краткое описание куска кода.
0
Jin X
❗❗ RTFM 👈
3998 / 1142 / 151
Регистрация: 14.12.2014
Сообщений: 2,284
Записей в блоге: 4
Завершенные тесты: 2
03.01.2017, 19:56  [ТС] #16
Цитата Сообщение от Constantin Cat Посмотреть сообщение
Вы наверное забыли, что у PROC есть ещё куча полезных параметров:
USES регистры - компилятор САМ, без Вашего участия раставит нужные PUSH и POP в начале и в конце программы. И не нужно парится в какой последовательности они сохранялись.
Никто не забыл. Вопрос-то вообще не в этом. Почему-то разговор ушёл совсем в другое русло
Изначальный вопрос был о том, как прыгнуть внутрь процедуры. Нашлось 2 варианта (для MASM): либо ссылка с двумя двоеточиями, либо оформить остаток кода внутри процедуры как отдельную процедуру.
Мне понравился вариант с двоеточиями, на что мне говорят, что "процедура в процедуре" лучше. И посему я спрашиваю: чем лучше? Зачем мне оформлять этот код, как отдельную процедуру? В ответ получаю рассказ о том, что proc - это конструкция, которая создаёт прологи и эпилоги, прозрачно для программиста работающие со стеком. Это всё понятно и замечательно. Я это и так знаю.
Но! Внимание: зачем они мне в этом месте сдались? Это раз. И второе: их там не будет, т.к. в данном конкретном случае proc используется без uses, без local, без arg и пр.
Ведь этот прыжок будет происходить из другой процедуры. И больше эта метка ни для чего не нужна.

Добавлено через 4 минуты
Это всё равно, что на вопрос "Как выдернуть гвоздь?" найти два ответа: гвоздодёром и пассатижами. И выбрав гвоздодёр получить возражение, что пассатижи лучше, т.к. ими можно ещё и шляпку откусить, да свернуть потом этот гвоздь буквой "зю" (и вообще, это реальный многофункциональный инструмент, им ещё много чего можно сделать). Но мне не надо кусать шляпку и буква "зю" мне не нужна! Вот если б ими было удобнее гвоздь дёргать, тогда другое дело. А то аргументы как-то не в тему...
0
ФедосеевПавел
Модератор
3412 / 1909 / 815
Регистрация: 01.02.2015
Сообщений: 6,449
03.01.2017, 20:08 #17
Когда-то я был ремонтником электроники. Среди прочего чинил компьютерную плату расширения (ограниченная заказная партия), подключаемую к шине ISA. Подходил 5-10 летний срок эксплуатации этих плат и они стали приходить в ремонт. На 5-слойной печатной плате располагалось полсотни микросхем серии кр555. Схемы не было (частично я её воссоздал прозвонкой). Но была тестовая программа (DOS com 8КиБ, 2,5 тыс строк дизассемблированного кода) от завода-изготовителя.
Для удобства ремонта мне нужно было зациклить выполнение программы, убрать ввод адресов и прерываний, выполнять по шагам на шине ISA (хотя бы на части этих шагов записать контрольные значения на некоторых микросхемах). Пришлось дизассемблировать. Не буду обманывать - до начала надеялся на то, что имею дело с программой с языка C (за счёт rtl, прологов+эпилогов, структурированности - надеялся сократить анализ). Но именно по многочисленным переходам внутрь процедур понял - ассемблер.

Тогда у меня было удивление от такого подхода. Но неприятия - точно не было (возможно, потому, что стояла задача ремонта, а не обучения или обсуждения, да и обсуждать не с кем было). С поставленными задачами (зацикливание, отключение ввода, создание контрольных точек в программе и на микросхемах) я тогда справился.

Так что такой подход (переход внутрь процедур) - имеет (имел в эпоху DOS) практические воплощения в жизни.

За напоминание о более сложном синтаксисе директивы proc - спасибо.
Здесь http://www.cyberforum.ru/assembler/thread1644591.html хороший пример применения proc (masm) приводит KyberMax.
0
03.01.2017, 20:08
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.01.2017, 20:08
Привет! Вот еще темы с решениями:

MASM
Подскажите в чем проблема. данные .data FontName db "MS Sans Serif",0...

MASM компилятор
Дан список записей типа ФАЙЛ: название (строка 20 символов), расширение (строка...

Из Fasm в MASM
Ребят обращаюсь вот по какому вопросу , я сделал курсовой проект в FASM , с...

из .com в .exe (MASM)
Вот исходник .com файла: .MODEL TINY CODE SEGMENT ORG 100H BEG: CLD...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru