Встройте ассемблерный призыв к подпрограмме

У меня есть вопрос о встроенном ассемблере. Возможно назвать другую ассемблерную подпрограмму от встроенного ассемблера в той же функции? Например:

void FindValidPID(unsigned int &Pid) 
{
    __asm
    {
        sub esp, 20h
        mov eax, Pid
        add eax,eax
        call sub123 ; another assm subroutine
        mov Pid, eax
        add esp, 20h
    }
}

Где я, и как, должен записать подпрограмму sub123?

Удачи,
Thomas

6
задан starblue 10 February 2010 в 21:02
поделиться

4 ответа

Судя по синтаксису, я предполагаю, что используемый компилятор - это VC ++? Если это так, голая функция ( http://msdn.microsoft.com/en-us/library/5ekezyy2 (VS.80) .aspx ) должна позволить вам определить функцию, которую можно легко вызвать из код языка ассемблера.

(Голые функции также видны для C ++, поэтому вы можете вызывать их и из C ++ и потенциально получать неверные результаты ... так что будьте осторожны!)

1
ответ дан 17 December 2019 в 07:04
поделиться

Предположим, у вас есть подпрограмма _func2 , написанная на ассемблере (я знаю только синтаксис NASM).

    global  _func2

    section .text
_func2:
    ret

Вы можете вызвать эту подпрограмму из кода C ++ следующим образом

extern "C" {
void func2();
}

void func1()
{
    __asm {
        call func2
    }
}

int main()
{
    func1();
}

Конечно, func2 также может быть функцией C / C ++ с блоком __ asm .

1
ответ дан 17 December 2019 в 07:04
поделиться

Формат ^ < n > позволяет выбрать n-й родитель фиксации (релевантный в слияниях). Формат ~ < n > позволяет выбирать n-й предок, всегда следующий за первым родителем. Некоторые примеры см. в документации git-rev-parse .

-121--1780319-

Приложение JEdivePane не может вычислить конечную предпочтительную ширину и высоту одновременно, оно должно знать одно, прежде чем вычислить другое.

При первом проходе JEdivePane вычисляет предпочтительную высоту, исходя из предположения, что ее ширина будет неограниченной, поэтому возвращает высоту одной строки (поскольку текст не содержит разрывов строк.)

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

Таким образом, самое простое решение состоит в том, чтобы установить максимальную ширину при каждой установке текста.

String text = "Potentially looooooong text. " + 
    "Lorem ipsum dolor sit amet, consectetuer" +
    "adipiscing elit, sed diam nonummy nibh euismod " +
    "tincidunt ut laoreet dolore magna aliquam" + 
    "adipiscing elit, sed diam nonummy nibh euismod" + 
    "erat volutpat. Ut wisi enim ad minim veniam, " + 
    "quis nostrud exerci tation.";

final JEditorPane editorPane = new JEditorPane("text/html", text);
editorPane.setSize(300, Integer.MAX_VALUE);
editorPane.setEditable(false);

Не беспокойтесь о том, чтобы сделать его слишком большим, он все равно будет сокращаться, чтобы соответствовать содержимому (как вы увидите, если вы измените текст на «Hello, World!» .

-121--4746289-

Вы могли бы сделать это, создав другую функцию так же, как вы сделали с 1-й, а затем вызвать ее с искореженным именем, как вызов __ GLOBAL __ I _ sub123; .

Может быть хорошей идеей объявить его как extern «C» , чтобы сделать вещи проще.

В gcc можно использовать gcc -S file.cpp для просмотра искомого имени функции.

0
ответ дан 17 December 2019 в 07:04
поделиться

Если вы пишете всю подпрограмму на ассемблере, вам следует рассмотреть возможность использования ассемблера на уровне файлов, а не встроенного.

2
ответ дан 17 December 2019 в 07:04
поделиться
Другие вопросы по тегам:

Похожие вопросы: