[英]Porting Assembly to C/C++?
我想將此 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
在一般情況下,這是無法完成的。 在此特定情況下,無法完成此操作,因為此匯編程序直接與PC BIOS交互,使用int 10h
打開320x200 256 VGA模式,並且通過寫入IO端口0x3c8和0x3c9直接與PC硬件交互(這將設置VGA調色板)並通過讀取0x3da(VGA狀態寄存器)和0x60(PC鍵盤微控制器)讀取。 它還直接寫入VGA視頻存儲器。
在具有MS-DOS或類似操作系統的PC兼容計算機上執行的條件下(或在諸如dosbox之類的模擬環境中),可以做到這一點:您可以使每個CPU都注冊一個C變量,並使每個程序集助記符為C函數修改這些變量或絕對內存地址或IO端口寫入(與outb()
和inb()
或者,我認為這將是一個更有趣的任務,了解這個演示做數學,並實施以便攜式的方式。
無論哪種方式,我都沒有聽說過可以自動執行此操作的工具。 現有工具可能會處理簡單的邏輯,但是了解演示絕非易事! 什么自動程序可以告訴你
imul ax,8405h
inc ax
應該用ax = rand();
代替ax = rand();
?
您可以將其扔到RentaCoder上,並付一些錢給人手工編寫C版本,包括注釋如何完成的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.