2016-11-06 5 views
1

약간의 nasm 프로젝트 {synth.asm, synth_core.nh}을 작은 소프트 신서사이저에 대해 조금 더 배우기 시작하고 싶습니다.C NAMM 코드 구현

문제는 내 asm 지식이 매우 녹슬었고, 나는 어디서부터 시작해야할지 궁금합니다. 아마도 하나의 디 컴파일러가 나를 도울 수있을 것이라고 생각했지만이 간단한 nasm 목록을 c로 변환 할 수있는 오픈 소스를 찾지 못했습니다. 또 다른 대안은 변환 asm->을하고있을 것

수동으로하지만 가장 간단한 기능 중 하나 :(

을 이해하기 위해 사투를 벌인거야 c는 예 :

;distortion_machine 
;--------------------------- 
;float a 
;float b 
;--------------------------- 
;ebp: distort definition 
;edi: stackptr 
;ecx: length 
section distcode code align=1 
distortion_machine: 
    pusha 
    add ecx, ecx 
    .sampleloop: 
     fld dword [edi] 
     fld dword [ebp+0] 
     fpatan 
     fmul dword [ebp+4] 
     fstp dword [edi] 
     scasd 
    loop .sampleloop 
    popa 
    add esi, byte 8 
ret 

깨진 시도 :

void distortion_machine(???) { // pusha; saving all registers 
    int ecx = ecx+ecx; // add ecx, ecx; this doesn't make sense 

    while(???) { // .sampleloop; what's the condition? 
     float a = [edi]; // fld dword [edi]; docs says edi is stackptr, what's the meaning? 
     float b = [ebp+0]; // fld dword [ebp+0]; docs says ebp is distort definition, is that an input parameter? 
     float c = atan(a,b); // fpatan; 
     float d = c*[ebp+4]; // fmul dword [ebp+4]; 
     // scasd; what's doing this instruction? 
    } 

    return ???; 

    // popa; restoring all registers 
    // add esi, byte 8; 
} 

위의 nasm 목록은 간단한 오디오 버퍼를 왜곡시키는 매우 단순한 루프이지만 어떤 것이 입력이고 어느 것이 출력인지 이해하지 못한다고 생각합니다. 루프 조건을 이해하지 못한다. ')

위의 루틴에 대한 도움과이 작은 교육 프로젝트를 진행하는 방법에 대한 도움은 정말 감사하겠습니다.

+0

'add ecx, ecx'는 함수가 작동하는 경우 의미가있는 두 개의 ecx를 곱하는 것을 의미합니다. 예를 들어'short' 샘플 (2 바이트)이고 length는 is입니다. 샘플로 표현. – Jack

+1

게시물에 질문을 하나만하십시오. 질문은 "어떻게 nasm 어셈블리를 C로 변환 할 수 있습니까?"라고 가정합니다. "을 수행하는 방법에 대한 제안이 필요합니다."라는 질문이나 "이 코드는 무엇을 하는가"는 주제와 관련이 없습니다. – BadZen

+0

@ Jack Ok, 루틴이'short *'입력 버퍼를 변경한다고 가정 해 봅시다. 그러나 'loop'는 ecx를 1 씩 감소시키고 있습니까? 이런 맥락에서'ebp'와'edi'의 의미는 무엇입니까? – BPL

답변

5

여기 추측 조금있다 :

;distortion_machine 
;--------------------------- 
;float a << input is 2 arrays of floats, a and b, successive on stack 
;float b 
;--------------------------- 
;ebp: distort definition << 2 floats that control distortion 
;edi: stackptr   << what it says 
;ecx: length    << of each input array (a and b) 
section distcode code align=1 
distortion_machine: 
    pusha  ; << save all registers 
    add ecx, ecx ; << 2 arrays, so double for element count of both 
    .sampleloop: 
     fld dword [edi] ; << Load next float from stack 
     fld dword [ebp+0] ; << Load first float of distortion control 
     fpatan    ; << Distort with partial atan. 
     fmul dword [ebp+4] ; << Scale by multiplying with second distortion float 
     fstp dword [edi] ; << Store back to same location 
     scasd    ; << Funky way to incremement stack pointer 
    loop .sampleloop  ; << decrement ecx and jump if not zero 
    popa     ; << restore registers 
    add esi, byte 8  ; << See call site. si purpose here isn't stated 
ret 

그것은 진짜 추측하지만, esi는 별도의 인수 스택 포인터 수 있으며, ab의 주소가 추진되고있다. 이 코드는 데이터 스택 레이아웃에 대한 가정을 통해 무시하지만 여전히 arg 스택에서 해당 포인터를 제거해야합니다.

대략 C :는 C 재 구현에서

struct distortion_control { 
    float level; 
    float scale; 
}; 

// Input: float vectors a and b stored consecutively in buf. 
void distort(struct distortion_control *c, float *buf, unsigned buf_size) { 
    buf_size *= 2; 
    do { // Note both this and the assembly misbehave if buf_size==0 
    *buf = atan2f(*buf, c->level) * c->scale; 
    ++buf; 
    } while (--buf_size); 
} 

, 당신은 아마 더 명시 적이어야하며 크기가 0 인 버퍼 버그를 수정 할 것입니다.

+0

와우, 굉장해! 대단히 감사합니다. 이제 음악의 작은 C 플레이어를 작성하기 위해 다른 오디오 루틴을 다시 구현할 수있게 될 것입니다. 당신의 번역은 완전히 의미가 있습니다 .-D – BPL

+0

@BPL 감사합니다. 참고 float를 처리하는 math.h의 새로운 C99 함수 인 atan2f를 사용하도록 코드를 변경했습니다. 원본을 사용하면 이중 변환으로 인해 속도가 상당히 느리고 atan2는 배정도로 느려집니다. – Gene

+0

예, 확실하게 :). 지금 당장 가장 중요한 관심사는 스피드가 아니라 synth (한 번에 음악을 미리 계산 함)에서 완벽한 포트 (asm 버전과 동일한 출력)를 얻는 것입니다. 그런 다음 실시간으로 변환하려고 시도합니다. 신스. 어쨌든, 당신의 숨은 기술은 완전히 놀랍습니다. 지금 당장은이 과정에서'esi','edi','scasd'로 여전히 고민 중입니다. 주된 일상을 번역 할 때 더 잘 이해하게 될 것입니다. D – BPL