Q
Q
Qubc2017-11-24 23:06:17
linux
Qubc, 2017-11-24 23:06:17

Why do program codes differ after gcc -S in Ubuntu and Windows?

spoiler
Я изучил школьный эмулятор ассемблера ЛамПанель, хочу двигаться дальше, к сожалению, программирование не основная специальность. Возникают вопросы, которые, наверняка описаны например у Таненбаума, верно? В симуляторе всё было не так сложно, как на х86. Разрядность процессора там была 16, адресация 8 разрядная. Пишется код на мнемониках, затем этот код просто транслируется в машинные команды и записывается в память. Как таковой процесс компоновки не затрагивается, нету .exe или .com или .out.
Основной интерес - это ассемблер на arm или иных микроконтроллерах.

The question is stupid - when code is written in C, then this code is written, as it were, not for the processor itself, but for the operating system, so it differs in the examples, right? Or is this difference just caused by different compiler versions?
int main (){
  int a = 333;
  return 0;
}

gcc -S test.c
gcc -S . /test.c
Win7
.file	"test.c"
  .def	___main;	.scl	2;	.type	32;	.endef
  .text
  .globl	_main
  .def	_main;	.scl	2;	.type	32;	.endef
_main:
LFB0:
  .cfi_startproc
  pushl	%ebp
  .cfi_def_cfa_offset 8
  .cfi_offset 5, -8
  movl	%esp, %ebp
  .cfi_def_cfa_register 5
  andl	$-16, %esp
  subl	$16, %esp
  call	___main
  movl	$333, 12(%esp)
  movl	$0, %eax
  leave
  .cfi_restore 5
  .cfi_def_cfa 4, 4
  ret
  .cfi_endproc
LFE0:
  .ident	"GCC: (GNU) 5.3.0"

ubuntu
.file	"test.c"
  .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
  movl	$333, -4(%rbp)
  movl	$0, %eax
  popq	%rbp
  .cfi_def_cfa 7, 8
  ret
  .cfi_endproc
.LFE0:
  .size	main, .-main
  .ident	"GCC: (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3"
  .section	.note.GNU-stack,"",@progbits

Answer the question

In order to leave comments, you need to log in

1 answer(s)
V
Vladimir Dubrovin, 2017-11-24
@Qubc

The main difference is in the code, that under Windows you compiled the code as 32-bit, and under Ubuntu - 64-bit. The remaining differences are cosmetic, at the level of information for the linker.

Didn't find what you were looking for?

Ask your question

Ask a Question

731 491 924 answers to any question