Использовать область действия процедуры, чтобы избежать локальных меток?
Я перенес немного кода MASM в NASM. Порт был довольно безболезненным, за исключением необходимости местных этикеток. Локальные метки были необходимы, потому что в коде MASM было несколько процедур, и некоторые метки были общими для этой процедуры. Например
;; MASM code
_FOO PROC
...
Exit_Failure:
...
Exit_Success:
...
ret
_FOO ENDP
_BAR PROC
...
Exit_Failure:
...
Exit_Success:
...
ret
_BAR ENDP
Под NASM я должен использовать местные метки. Например:
;; NASM code
global _FOO
section .text
_FOO:
...
.Exit_Failure:
...
.Exit_Success:
...
ret
Когда код собран с отладочной информацией, он производит метки, которые являются бельмом на глазу (для меня). Код будет производить ярлыки _FOO.Exit_Failure
, _FOO.Exit_Success
и так далее. В дополнение к тому, чтобы быть бельмом на глазу, они усложняют портирование, потому что я должен добавить точку к каждой метке
Кажется, я не могу найти в NASM понятие "именованного" раздела кода, чтобы метка могла быть ограничена.
Как мне охватить процедуры, чтобы избежать необходимости в местных ярлыках?
1 ответ
NASM частично обеспечивает функцию локальной метки с префиксом, чтобы вы могли создавать метки локальной процедуры. Не существует MASM-эквивалентной настройки для того, чтобы метки всегда были локальными для процедур, потому что сам NASM на самом деле не распознает существование процедур. Он просто хранит записи меток, которые мы иногда используем в качестве точек входа в процедуру, и NASM не может реально отличить эти метки от других или любых других нелокальных меток. Вы можете сделать макро-локальные метки с префиксом %% вместо точки, но это все.