как вызвать функцию в сборке? - PullRequest
0 голосов
/ 17 апреля 2020

Как мне go обозначить часть моего кода сборки как функцию и вызвать эту функцию из блока _asm {}? Скажем, например, что я хотел, чтобы функция начиналась с for l oop, элементы "n" заполняются значением.

#include <stdio.h>
#include <string.h>


void printBytes(char *data, int length)
{
    int x;
    for (x = 0; x < length; x++)
    {
        if ((x & 0xF) == 0) printf("\n");
        printf("%02X ", (unsigned char)data[x]);
    }
    printf("\n\n");
    return;
} // printBytes

void function(){

    char string[] = "The end is near!";
    void* dst = &string;
    unsigned char value = 0xA5;
    int nCount = 5;

    printf("The message is: %s\n", string);
    printBytes(string, strlen(string)); 

    __asm {

        //type cast the str from void* to char*
            mov eax, DWORD PTR [dst]
            mov DWORD PTR [ebp-88], eax

        //fill "n" elements/blocks with value
            mov DWORD PTR [ebp-76], 0
            jmp label_3
        label_2:
            mov eax, DWORD PTR[ebp-76]
            add eax, 1
            mov DWORD PTR [ebp-76], eax
        label_3:
            mov eax, DWORD PTR [ebp-76]
            cmp eax, DWORD PTR [nCount]
            jge EXIT

            mov eax, DWORD PTR [ebp-88]
            add eax, DWORD PTR [ebp-76]
            mov cl, BYTE PTR [value]
            mov BYTE PTR[eax], cl
            jmp label_2
        EXIT:

    }// asm_memset */

    printf("Now the message is: %s\n", string);
    printBytes(string, strlen(string));
    return;

}

int main() {

    function();

    printf("Press ENTER key to continue...");
    getchar();
    return(0);
}

1 Ответ

0 голосов
/ 17 апреля 2020

Обратите внимание, что решение вашей проблемы, вероятно, будет непереносимым.

Вам нужно будет найти ABI для вашей архитектуры / системы / компилятора и выполнить его вызов конвенции.

...