hankviv / blog_issue

issue
2 stars 0 forks source link

汇编入门 #16

Open hankviv opened 4 years ago

hankviv commented 4 years ago

image

    int add_a_and_b(int a, int b) {
    return a + b;
    }

    int main() {
    return add_a_and_b(2, 3);
    }

    _add_a_and_b: #创建新的帧
    push %ebx #先把ebx的值写到帧内
    mov %eax, [%esp+8] # 取 ESP+8 放在eax
    mov %ebx, [%esp+12] # 取ESP+12 放在ebx
    add %eax, %ebx #ebx的值加入到eax
    pop %ebx #pop出Stack内的的值给ebx
    ret #终止当前函数,运行交还给上层函数,帧被回收。
    _main: #Stack 上为main建立一个帧,并将Stack地址,写入ESP。
    push 3 # ESP = ESP - 4 这个地址存4位
    push 2 # ESP = ESP - 4 这个地址存4位
    call _add_a_and_b # 寻找_add_a_and_b标签,并为该函数建立一个新的帧
    add %esp, 8 ,#将 ESP 寄存器里面的地址,手动加上8个字节,再写回 ESP 寄存器。回收内存地址
    ret #终止当前函数