Портирование сборки на C / C ++? - PullRequest
0 голосов
/ 16 июля 2010

Мне бы хотелось, чтобы этот x86 код ASM был перенесен на C или C ++, поскольку я не понимаю ASM =)

Поиск в Google выглядит так: Relogix и IDA Pro может это сделать.Но я не думаю, что они дешевы, учитывая, что у меня есть только один этот источник.

Понять математику или алгоритм, как он работает, было бы так же хорошо, как я собираюсь использовать OpenGL в любом случае.

Есть ли другие методы?

;
;  a n d r o m e d a 
;                        
;  a 256b demo
;  by insomniac/neon
;
code    SEGMENT
    ASSUME  CS:code, DS:code
    p386
    LOCALS

ORG 100h

max =   4096
maxZ    =   5000

b   EQU byte ptr

Start:  lea di,vars
    mov ch,60
    rep stosw

    mov al,13h
    int 10h

p    al:    mov al,cl
    mov dx,3c8h
    out dx,al
    inc dx
    cmp al,64
    jb  b64_1
    mov al,63
b64_1:  out dx,al
    mov al,cl
    shr al,1
    out dx,al
    out dx,al
    loop    pal


.main:  push    8000h
    pop ES

    mov si,max

.loop:  mov ax,Z[si]
    cmp ax,maxZ-(maxZ/4)
    jg  NewStar
    cmp ax,2
    jg  Zok
NewStar:
    mov ax,bp
    mov X[si],ax

    imul    ax,8405h
    inc ax
    mov bp,ax

    shr ax,6
    sub ax,400
    mov Y[si],ax

    mov Z[si],maxZ-(maxZ/2)

Zok:    mov ax,X[si]
    movsx   dx,ah
    shl ax,8

    mov cx,Z[si]

    idiv    cx
    add ax,320/2
    cmp ax,320-1
    jge NewStar
    cmp ax,1
    jle NewStar

    mov di,ax

    mov ax,Y[si]
    movsx   dx,ah
    shl ax,8
    idiv    cx
    add ax,200/2

    imul    ax,320
    add di,ax

    mov al,127
    stosb

    mov ax,X[si]
    cmp ax,00
    jge .add
    neg ax
    shr ax,6
    add Y[si],ax
    jmp .notadd
.add:   shr ax,6
    sub Y[si],ax
.notadd:
    add Z[si],ax
    mov ax,Y[si]
    sar ax,3
    add X[si],ax

.NextStar:
    dec si
    dec si
    jnz .loop

    push    DS
    push    ES
    pop DS

    xor di,di
    xor cx,cx
.blur:  movzx   ax,DS:[di]
    movzx   dx,DS:[di+1]
    add ax,dx
    mov dl,DS:[di-320]
    add ax,dx
    mov dl,DS:[di+321]
    add ax,dx
    shr ax,2

    cmp al,0
    je  .skip
    dec ax

.skip:  stosb
    loop    .blur

    push    0a000h
    pop ES

    mov si,di
    mov ch,81h
    rep movsw

    pop DS

    mov dx,3dah
.vrt:   in  al,dx
    test    al,8
    jz  .vrt

    in  al,60h
    dec ax
    jnz .main

endprog:
    mov al,3
    int 10h

    ret

LABEL   vars
X   dw  max DUP (?)
Y   dw  max DUP (?)
Z   dw  max DUP (?)

code    ENDS
    END Start

Ответы [ 3 ]

9 голосов
/ 16 июля 2010

В общем случае это не может быть сделано.В данном конкретном случае это невозможно сделать, потому что эта программа сборки взаимодействует с BIOS компьютера напрямую, используя int 10h для включения режима 320x200 256 VGA, и напрямую взаимодействует с оборудованием ПК, записывая в порты ввода-вывода 0x3c8 и 0x3c9 (это устанавливаетпалитра VGA) и путем чтения из 0x3da (регистр состояния VGA) и 0x60 (микроконтроллер клавиатуры ПК).Он также записывает данные непосредственно в видеопамять VGA.

В условиях выполнения на ПК-совместимом компьютере с MS-DOS или аналогичной ОС (или в моделируемой среде, такой как dosbox), это можно сделать:вы можете либо заставить каждый ЦП зарегистрировать переменную C, а каждую сборку мнемонику - функцию C, которая изменяет эти переменные или записывает данные по абсолютным адресам памяти или портам ввода-вывода (с outb() и inb()), или, и я думаю, чтонамного более интересная задача, понять математику, которую делает эта демонстрационная программа, и реализовать ее в переносимой форме.

В любом случае, я не слышал об инструментах, которые могли бы делать это автоматически.Существующие инструменты могут обрабатывать простую логику, но понимание демо-версии никогда не бывает легкой задачей!Какая автоматическая программа может сказать, что

imul    ax,8405h
inc ax

следует заменить на ax = rand();?

5 голосов
/ 16 июля 2010

Вы можете добавить его на RentaCoder и заплатить кому-нибудь несколько долларов за написание версии C от руки , включая аннотацию того, как это было сделано.

1 голос
/ 16 июля 2010

Существует несколько способов сделать это, например this или this . ; -)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...