【问题标题】:Porting Assembly to C/C++?将程序集移植到 C/C++?
【发布时间】:2010-07-16 13:20:24
【问题描述】:

我想将this x86 ASM 代码移植到 C 或 C++,因为我不懂 ASM =)

在谷歌搜索它接缝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

【问题讨论】:

  • 为什么要在 exe 中进行演示?当然,它似乎是一个DOS程序,它不应该再在windows下运行了……
  • 学Assembler,试着理解一下,这个反编译的东西在DOS下不行吗?
  • 重新。 ReLogix:“汇编程序 cmets 自动结转”。那么,这将在这里有所帮助!
  • 阅读这段代码让我感觉像是在 1992 年。感谢您回到有趣的大学时光!

标签: c++ c assembly


【解决方案1】:

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

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

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

imul    ax,8405h
inc ax

应该替换为ax = rand();

【讨论】:

  • 理解数学或算法的工作原理和我将使用 OpenGL 一样好。反编译器能在这方面做合理的工作吗?是的,你的 'rand()' 例子很可怕 =)
  • 我不会抱太大希望,但它可能为您提供一个神秘的黑盒程序,您可以使用它来计算帧数。只要您意识到从push 0a000hjnz .main 的行将320x200 图像复制到视频内存并在循环计算下一帧之前暂停刷新(除非按下键)。就像@John 说的那样,最好有人亲自动手。
【解决方案2】:

你可以把它扔到 RentaCoder 上,然后花几美元给某人手工编写一个 C 版本,包括如何完成的注释。

【讨论】:

  • 嗯,我第一次因为建议付钱给别人为你做这件事而得到'+' :)
  • 是的,令人惊讶。对于这种情况,这实际上是一个好主意:P
【解决方案3】:

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

【讨论】:

    猜你喜欢
    • 2011-03-13
    • 2010-10-13
    • 1970-01-01
    • 1970-01-01
    • 2010-09-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-15
    相关资源
    最近更新 更多