Встроенная сборка в C с Turbo C 3.0 - как получить адрес метки - PullRequest
4 голосов
/ 04 декабря 2011

Я пытаюсь получить адрес метки - вот пример кода:

int main() {
    asm {
        mov ax,1
        mov bx,ax
    }
  _labelname:
    asm {
        mov ax, OFFSET _labelname
    }

    return 0;
}

Компиляция этого кода возвращает эту ошибку: «неопределенный символ _labelname» Если я определю метку в блоке asm, я даже не смогу использовать jmp _labelname

Я нашел это и не работает, для это , на самом деле ни за что. Это говорит, что просто прыгает, а не адресует. И это совсем не помогает. Есть предложения?

Ответы [ 2 ]

0 голосов
/ 22 июня 2013

Обычно есть маршрут на любом языке, но вам нужно поискать его на день или два, потому что это не всегда задокументировано

Объявите глобальное пространство памяти в вашем аромате HLL. DIM LABELNAME1(0)

Затем найдите синтаксис asm, который помещает адрес в eax

mov eax, ^LABELNAME(0)
mov eax, dword [_lablename]
mov eax, ^_lablename
etc etc etc

затем вставьте его в asm

Вы не найдете pop [^ нигде в Google, но он работает в определенных HLL

push eax
pop [^LABELNAME1(0)]

Теперь ваш HLL и asm могут общаться друг с другом в любое время

Так что стоит разобраться


Undefined symbol _labelname

Вероятно, необходимо объявить в самом начале программы

._labelname
mov dword [_lablename], 0

и позже используется asm в качестве метки

Как я уже сказал, вам придётся возиться и выяснять это для вашего специфического аромата HLL, и глобалы, кажется, работают лучше

Вам также необходимо выяснить, как объявлять отдельные зоны памяти для хранения динамических переменных asm и выполнения кодов операций, иначе вы получите перезапись кеша, которая ограничит преимущества asm * 1028 по скорости.

Небольшая процедура, которую я написал, не разделяя эти асмы, заняла 20 часов. С разделением прошло 1 час


mov ax, OFFSET _labelname

Это 16-битные вещи (DOS и т. Д., С тупыми правилами памяти), разве вы не делаете 32-битные вещи со своим HLL ???

Если это не происходит в одном сегменте, вам понадобится операнд с двойной памятью, чтобы найти _labelname, dx:ax и т. Д., И, как упоминалось ранее, вы опоздали на 20 лет

jmp cs:_labelname

Работает в том же сегменте, но для более крупной программы часть cs должна иметь конкретное переопределение сегмента и дальний переход / возврат

Кроме того, если ваши динамические переменные asm вставлены в ваш сегмент кода asm, то основное правило для максимизации скорости asm было нарушено

0 голосов
/ 04 декабря 2011

Я нашел способ, но вы не можете использовать метку C, это должна быть метка asm:

int main(void)
{
    asm {
        mov ax,1
        mov bx,ax
    }

    asm { _labelname: }

    asm {
        mov ax, OFFSET _labelname
        jmp cs:_labelname
    }

    return 0;
}
...