यहाँ मुख्य का विधानसभा कोड है:

push   %rbp
mov    %rsp,%rbp
sub    $0x20,%rsp
mov    %edi,-0x14(%rbp)
mov    %rsi,-0x20(%rbp)
mov    -0x20(%rbp),%rax
add    $0x8,%rax
mov    (%rax),%rax
mov    %rax,%rdi
callq  0x510 <atoi@plt>
mov    %eax,-0x4(%rbp)
mov    -0x4(%rbp),%edx
mov    -0x14(%rbp),%eax
mov    %edx,%esi
mov    %eax,%edi
callq  0x63a <sub>
leaveq 
retq 

और यहाँ सी संबंधित कोड है:

#include <stdlib.h>
int sub(int x, int y){
        return 2*x+y;
}

int main(int argc, char ** argv){
        int a;
        a = atoi(argv[1]);
        return sub(argc,a);
}

मेरा मानना ​​​​है कि यह स्टैक में 20 बिट्स आवंटित कर रहा है, फिर यह पैरामीटर के मानों को दाएं से बाएं आरबीपी -14 और आरबीपी -20 में दबा रहा है, क्या मैं सही हूं? इसे 20 बिट्स की आवश्यकता क्यों है? और 0x8 को rax में क्यों जोड़ा जाता है?

0
Gustavo B. 23 पद 2019, 02:34

1 उत्तर

सबसे बढ़िया उत्तर

यहाँ एक एनोटेट संस्करण है: / एक स्टैक फ्रेम स्थापित करें। स्टैक को एबीआई के अनुरूप संरेखित किया जाना चाहिए, / इसलिए केवल 2 (*8 = 16) स्थान आवश्यक होने के बावजूद, 4 8-बाइट (=32) / स्थान आरक्षित हैं। पुश %rbp mov %rsp,%rbp उप $0x20,%rsp

/ store away argc, argv for later.
    mov    %edi,-0x14(%rbp)
    mov    %rsi,-0x20(%rbp)
/ get the value of argv[1]:  argv is a vector of char *, so
/ load argv:
    mov    -0x20(%rbp),%rax
/ index by 1:
    add    $0x8,%rax
/ load argv[1].
    mov    (%rax),%rax
/ copy into first parameter of atoi
    mov    %rax,%rdi
    callq  0x510 <atoi@plt>
/ store the result
    mov    %eax,-0x4(%rbp)
/ load parameter 2 of sub:
    mov    -0x4(%rbp),%edx
/ load parameter 1 of sub (argc).
    mov    -0x14(%rbp),%eax
/ move parameters to abi parameter registers
    mov    %edx,%esi
    mov    %eax,%edi
    callq  0x63a <sub>
/ remove stack frame for this function
    leaveq 
    retq 

यह संस्करण अनावश्यक भार को हटाता है, स्पष्टता के लिए स्टोर करता है:

push   %rbp
mov    %rsp,%rbp
sub    $0x20,%rsp
mov    %edi,-0x14(%rbp)
mov    8(%rsi), %rdi
callq  0x510 <atoi@plt>
mov    %eax, %rsi
mov    -0x14(%rbp), %rdi
callq  0x63a <sub>
leaveq 
retq 
0
mevets 23 पद 2019, 17:45