0

Having this code:

int main (void) {

    int dividend =20;
    int divisor =4;
    int res;

    asm( 
        "divb %2\n\t"
        "movl %%eax, %0"
        : "=m"(res)
        : "a"(dividend), "m"(divisor));

    printf("res:%d\n",res);

    return 0;
}

Generates this asm:

main:
.LFB6:
    .cfi_startproc
    pushq   %rbp    #
    .cfi_def_cfa_offset 16
    .cfi_offset 6, -16
    movq    %rsp, %rbp  #,
    .cfi_def_cfa_register 6
    subq    $32, %rsp   #,
# c.c:4: int main (void) {
    movq    %fs:40, %rax    # MEM[(<address-space-1> long unsigned int *)40B], tmp92

The only thing I am interested in is what value is on the %fs:40, before going to rax (last row of asm). Why does compiler decided to put the var there? Moreover, why does it use offset 40? like %fs:40? What is there?

EDIT: I think it does have something with values in inline asm to be put in memory ("=m"(res)), So the %fs reg. is used by compiler to put temporary variables? But why are they put right in this segment? Does compiler have any internal mechanism to decide, on which address (and in a particular segment of course) should be variable put? (If programmer specify to place the var in memory, as is in this case).

Herdsman
  • 799
  • 1
  • 7
  • 24

0 Answers0