簡體   English   中英

是否將程序集移植到C / C ++?

[英]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版本,包括注釋如何完成的。

這樣做的方法很多,例如thisthis ;-)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM