симулятор процессора

Вопросы написания собственного программного кода (на любых языках)

Модератор: Olej

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: симулятор процессора

Непрочитанное сообщение Olej » 20 дек 2017, 01:17

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

Ответить

Вернуться в «Программирование»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 9 гостей