我想把this x86 ASM代码移植到C或C++,因为我不理解ASM=)
搜索Google it seamsRelogix和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

最佳答案

一般来说,这是做不到的。在这种特殊情况下,这无法完成,因为此汇编程序直接与PC BIOS交互,使用int 10h打开320x200 256 VGA模式,并直接与PC硬件交互,通过写入IO端口0x3c8和0x3c9(这将设置VGA调色板)以及读取0x3da(VGA状态寄存器)和0x60(PC键盘微控制器)。它还直接写入VGA视频内存。
在PC兼容计算机上执行MS-DOS或类似操作系统(或在模拟环境(如dosbox)的条件下,这可以做到:您可以让每个CPU注册一个C变量,让每个程序集助记符成为修改这些变量的C函数,或者在绝对内存地址或IO端口(使用outb()inb())写入,或者,我认为这将是一个更有趣的任务,理解这个演示所做的数学,并以可移植的方式实现它。
不管怎样,我都没听说过能自动完成这项工作的工具。现有的工具可能处理简单的逻辑,但理解演示永远不是一件容易的事!什么自动程序能告诉你

imul    ax,8405h
inc ax

是否应替换为ax = rand();

07-24 09:45