Это компиляция нашим компилятором одного из эталонных примеров:Olej писал(а): А вот 64-бит вариант, в точности эквивалентный 3-му изданию книги.
Код: Выделить всё
[olej@dell Y86-64]$ cat asum.yo
| # Execution begins at address 0
0x0000: | .pos 0
0x0000: 30f40002000000000000 | irmovq stack, %rsp # Set up stack pointer
0x000a: 803800000000000000 | call main # Execute main program
0x0013: 00 | halt # Terminate program
|
| # Array of 4 elements
0x0018: | .align 8
0x0018: 0d000d000d000000 | array: .quad 0x000d000d000d
0x0020: c000c000c0000000 | .quad 0x00c000c000c0
0x0028: 000b000b000b0000 | .quad 0x0b000b000b00
0x0030: 00a000a000a00000 | .quad 0xa000a000a000
|
0x0038: 30f71800000000000000 | main: irmovq array,%rdi
0x0042: 30f60400000000000000 | irmovq $4,%rsi
0x004c: 805600000000000000 | call sum # sum(array, 4)
0x0055: 90 | ret
|
| # long sum(long *start, long count)
| # start in %rdi, count in %rsi
0x0056: 30f80800000000000000 | sum: irmovq $8,%r8 # Constant 8
0x0060: 30f90100000000000000 | irmovq $1,%r9 # Constant 1
0x006a: 6300 | xorq %rax,%rax # sum = 0
0x006c: 6266 | andq %rsi,%rsi # Set CC
0x006e: 708700000000000000 | jmp test # Goto test
0x0077: 50a70000000000000000 | loop: mrmovq (%rdi),%r10 # Get *start
0x0081: 60a0 | addq %r10,%rax # Add to sum
0x0083: 6087 | addq %r8,%rdi # start++
0x0085: 6196 | subq %r9,%rsi # count--. Set CC
0x0087: 747700000000000000 | test: jne loop # Stop when 0
0x0090: 90 | ret # Return
|
| # Stack starts here and grows to lower addresses
0x0200: | .pos 0x200
0x0200: | stack:
|
Код: Выделить всё
[olej@dell Y86-64]$ ./yis.orig asum.yo
Stopped in 34 steps at PC = 0x13. Status 'HLT', CC Z=1 S=0 O=0
Changes to registers:
%rax: 0x0000000000000000 0x0000abcdabcdabcd
%rsp: 0x0000000000000000 0x0000000000000200
%rdi: 0x0000000000000000 0x0000000000000038
%r8: 0x0000000000000000 0x0000000000000008
%r9: 0x0000000000000000 0x0000000000000001
%r10: 0x0000000000000000 0x0000a000a000a000
Changes to memory:
0x01f0: 0x0000000000000000 0x0000000000000055
0x01f8: 0x0000000000000000 0x0000000000000013
Код: Выделить всё
[olej@dell Y86-64]$ ./yis asum.yo
.x -1
.f
Executed 34 steps at IP = 0x0013. Status HALT, ZF=1 SF=0 OF=0
.d
Changes to registers:
%rax: 0x0000000000000000 0x0000abcdabcdabcd
%rsp: 0x0000000000000000 0x0000000000000200
%rdi: 0x0000000000000000 0x0000000000000038
%r8 : 0x0000000000000000 0x0000000000000008
%r9 : 0x0000000000000000 0x0000000000000001
%r10: 0x0000000000000000 0x0000a000a000a000
Changes to memory:
0x01f0: 0x0000000000000000 0x0000000000000055
0x01f8: 0x0000000000000000 0x0000000000000013
.r
Registers:
%rax=0x0000abcdabcdabcd %r8 =0x0000000000000008
%rcx=0x0000000000000000 %r9 =0x0000000000000001
%rdx=0x0000000000000000 %r10=0x0000a000a000a000
%rbx=0x0000000000000000 %r11=0x0000000000000000
%rsp=0x0000000000000200 %r12=0x0000000000000000
%rbp=0x0000000000000000 %r13=0x0000000000000000
%rsi=0x0000000000000000 %r14=0x0000000000000000
%rdi=0x0000000000000038
.q