将程序集移植到C / C ++?

时间:2010-07-16 13:20:24

标签: c++ c assembly

我想将this 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 个答案:

答案 0 :(得分:9)

一般情况下,无法做到这一点。在这种特殊情况下,这不能完成,因为这个汇编程序直接与PC BIOS交互,使用int 10h打开320x200 256 VGA模式,并通过写入IO端口0x3c8和0x3c9直接与PC硬件交互(这设置了VGA调色板)并通过读取0x3da(VGA状态寄存器)和0x60(PC键盘微控制器)。它还直接写入VGA视频内存。

在具有MS-DOS或类似操作系统的PC兼容计算机上执行的条件下(或者在dosbox等模拟环境中),可以这样做:您可以使每个CPU注册一个C变量,每个assembly mnemonic一个C函数,修改那些变量或写入绝对内存地址或IO端口(outb()inb()),或者,我认为这将是一个更有趣的任务,理解数学这个演示可以实现,并以可移植的方式实现。

无论哪种方式,我都没有听说过可以自动执行此操作的工具。现有工具可能会处理简单的逻辑,但理解演示绝非易事!什么自动程序可以告诉

imul    ax,8405h
inc ax

应替换为ax = rand();

答案 1 :(得分:5)

您可以将它扔在RentaCoder上并向某人支付几美元以手动编写C版 ,包括注释如何完成。

答案 2 :(得分:1)

有很多方法可以这样做,例如thisthis。 ; - )