https://github.com/ip1981/GCD/blob/mast
По системным вызовам Соляриса:
http://my.opera.com/myrkraverk/blog/201
Различия с линуксовой версией:
--- gcd-x86-linux.s 2011-07-04 00:33:43.000000000 +0400
+++ gcd-x86-solaris.s 2011-07-14 20:31:09.000000000 +0400
@@ -68,12 +68,15 @@
# printing the number:
mov $4, %eax # syscall `write'
- mov $1, %ebx # write to stdout
- mov %edi, %ecx # first character to write
mov $buf_end, %edx
sub %edi, %edx # edx is a number of characters to write (buf_end - edi)
inc %edx # + new line
- int $0x80 # do syscall (print the number)
+ push %edx
+ push %edi # first character to write
+ push $1 # write to stdout
+ push $0 # dummy
+ int $0x91 # do syscall (print the number)
+ add $16, %esp # clean stack 16 = 4 * 4 (32 bits!)
ret
@@ -133,6 +136,7 @@
exit:
mov $1, %eax # exit syscall
- xor %ebx, %ebx # exit code = 0
- int $0x80
+ push $0 # exit code = 0
+ push $0 # dummy
+ int $0x91
https://github.com/ip1981/GCD/blob/mast
Невероятный по красоте способ перевода строки в целое число
(http://www.cyberforum.ru/archive/t-214
str2uint_loop: lodsb # going forward from esi # HINT: assert '0' <= al <= '9' lea (%ebx, %ebx, 4), %ebx # ebx = 4*ebx + ebx = 5*ebx ;-) lea -48(%eax, %ebx, 2), %ebx # ebx = 2*ebx + %eax - 48 # ebx is multiplied by 10 each iteration, # eax-48 will be multiplied at the next iteration ;-) loop str2uint_loop ret
gcc заменяет printf с простой строкой на puts.
С -O2 выкидывает куски кода внутри 100%-ложных условий (if (0) {...}).
Круто, чо :-)
test.c:
#include <stdlib.h> #include <stdio.h> const int DEBUG = 0; int main ( int argc, char *argv[] ) { if (DEBUG) { printf("Debug!\n"); } return EXIT_SUCCESS; }
.file "test.c" .globl DEBUG .section .rodata .align 4 .type DEBUG, @object .size DEBUG, 4 DEBUG: .zero 4 .LC0: .string "Debug!" .text .globl main .type main, @function main: leal 4(%esp), %ecx andl $-16, %esp pushl -4(%ecx) pushl %ebp movl %esp, %ebp pushl %ecx subl $4, %esp movl DEBUG, %eax testl %eax, %eax je .L2 subl $12, %esp pushl $.LC0 call puts addl $16, %esp .L2: movl $0, %eax movl -4(%ebp), %ecx leave leal -4(%ecx), %esp ret .size main, .-main .ident "GCC: (GNU) 4.4.4" .section .note.GNU-stack,"",@progbits
.file "test.c" .text .p2align 4,,15 .globl main .type main, @function main: pushl %ebp movl %esp, %ebp xorl %eax, %eax popl %ebp ret .size main, .-main .globl DEBUG .section .rodata .align 4 .type DEBUG, @object .size DEBUG, 4 DEBUG: .zero 4 .ident "GCC: (GNU) 4.4.4" .section .note.GNU-stack,"",@progbits
Чтоб не забыть: минимальная программа на ассемблере,
выводящая "Hello!" (без glibc)
.data msg: .string "Hello!\n" .set length, . - msg - 1 .text .globl _start _start: movl $4, %eax movl $1, %ebx movl $msg, %ecx movl $length, %edx int $0x80 movl $1, %eax xorl %ebx, %ebx int $0x80