Правильно ли я понимаю этот цикл сборки? - PullRequest
0 голосов
/ 01 октября 2018

Я скомпилировал код C, который выполняет цикл, как показано ниже:

#include <stdio.h>

int main(int argc, char *args[]){
  for(int i = 0; i < argc; i++){
    printf("%s\n", args[i]);
  }
}

Я скомпилировал его с оптимизацией, выполнив gcc -O2 -S -c main.c.

, который дал этот вывод (у меня естьтоже сделал свои комментарии):

  .section  __TEXT,__text,regular,pure_instructions
  .globl  _main                   ## -- Begin function main
_main:                                  ## @main
  pushq %rbp                      #Backup base pointer
  movq  %rsp, %rbp                #point stack pointer to base pointer

  pushq %r14                      #Backup r14
  pushq %rbx                      #Backup rbx
  movq  %rsi, %rbx                #Move rsi (argc) to rbx
  testl %edi, %edi                # does edi == 0?
  jle LBB0_3                      #if <= 0; goto LBB0_3
## %bb.1:
  movl  %edi, %r14d               #set edi to
LBB0_2:                                 ## =>This Inner Loop Header: Depth=1
  movq  (%rbx), %rdi              #Move value of address of rbx into argument 1
  callq _puts                     #call puts print(argument two)
  addq  $8, %rbx                  #add eight to rbx (length of char type)
  decq  %r14                      #r14--
  jne LBB0_2                      #if edi != 0, goto LBB0_2
LBB0_3:
  xorl  %eax, %eax                #return 0

  popq  %rbx                      #restore rbx
  popq  %r14                      #restore r14

  popq  %rbp                      #restore base pointer
  retq                            #go to call address

И это мой псевдокод, который я создал из кода сборки:

rbx = command line arguments (CLI)
if argc == 0 {
    goto LBB0_3
}

r14d = argc
LBB0_2:
    arg1 =  value at CLI address
    puts(arg1)
    increment address of CLI by 8
    r14--
    if r14 != 0 {
        goto LBB0_3
    }
    goto LBB0_2
LBB0_3:
    return 0

Правильно ли мое понимание этого цикла сборки?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...