我想把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();
?