我想将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
答案 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)