в эмуляторе процессора требуется сборка для вызова внешней функции - PullRequest
0 голосов
/ 19 сентября 2018

в эмуляторе процессора требуется сборка для вызова внешней функции и сохранения там кода возврата, или это возможно сделать из языка, на котором кодируется эмулятор, например, в 64-битной сборке gnu gas:

        .file   "hello_world.c"
        .text
        .section        .rodata
.LC0:
        .string "hello world"
        .text
        .globl  main
        .type   main, @function
main:
.LFB0:
        .cfi_startproc
        pushq   %rbp
        .cfi_def_cfa_offset 16
        .cfi_offset 6, -16
        movq    %rsp, %rbp
        .cfi_def_cfa_register 6
        leaq    .LC0(%rip), %rdi
        call    puts@PLT
        movl    $0, %eax
        popq    %rbp
        .cfi_def_cfa 7, 8
        ret
        .cfi_endproc
.LFE0:
        .size   main, .-main
        .ident  "GCC: (Ubuntu 7.3.0-16ubuntu3) 7.3.0"
        .section        .note.GNU-stack,"",@progbits

может ли один вызов put выполнить, скажем,

rax = puts(/* register arguments 1 to 6 in order, plus stack arguments if any */);

в C, или требуется, чтобы EXPLICITLY вызывал путы через ассемблер, скажем, вызывая функцию, которая содержит встроенный asm, который принимает viardicАргументы, содержащие содержимое каждого виртуального регистра процессора, затем скопируйте их в сами регистры хоста, вызовите нужную функцию, затем скопируйте регистры хоста обратно в виртуальные регистры, затем верните

...