I made two programs to output two lines: one in the assembly, and the other in C. This is the program in the assembly:
.section .data string1: .ascii "Hola\0" string2: .ascii "Adios\0" .section .text .globl _start _start: pushl $string1 call puts addl $4, %esp pushl $string2 call puts addl $4, %esp movl $1, %eax movl $0, %ebx int $0x80
I am creating a program using
as test.s -o test.o ld -dynamic-linker /lib/ld-linux.so.2 -o test test.o -lc
And the result was as expected
Hola Adios
This is the C program:
#include <stdio.h> int main(void) { puts("Hola"); puts("Adios"); return 0; }
And I get the expected result, but when converting this C program to an assembly with gcc -S (OS is 32-bit Debian) the source code of the original assembly does not contain a null character in both lines, as you can see here:
.file "testc.c" .section .rodata .LC0: .string "Hola" .LC1: .string "Adios" .text .globl main .type main, @function main: .LFB0: .cfi_startproc leal 4(%esp), %ecx .cfi_def_cfa 1, 0 andl $-16, %esp pushl -4(%ecx) pushl %ebp .cfi_escape 0x10,0x5,0x2,0x75,0 movl %esp, %ebp pushl %ecx .cfi_escape 0xf,0x3,0x75,0x7c,0x6 subl $4, %esp subl $12, %esp pushl $.LC0 call puts addl $16, %esp subl $12, %esp pushl $.LC1 call puts addl $16, %esp movl $0, %eax movl -4(%ebp), %ecx .cfi_def_cfa 1, 0 leave .cfi_restore 5 leal -4(%ecx), %esp .cfi_def_cfa 4, 4 ret .cfi_endproc .LFE0: .size main, .-main .ident "GCC: (Debian 4.9.2-10) 4.9.2" .section .note.GNU-stack,"",@progbits
My two questions are:
1) Why doesn't the gcc assembly code add a null character at the end of both lines? I thought C did it automatically.
2) If I skip the null characters in my manual assembly code, I get this output:
HolaAdios Adios
I understand why I received the "HolaAdios" part in the first line, but why does the program end successfully after the "Adios" part if it does not end with zero?