약간의 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 목록은 간단한 오디오 버퍼를 왜곡시키는 매우 단순한 루프이지만 어떤 것이 입력이고 어느 것이 출력인지 이해하지 못한다고 생각합니다. 루프 조건을 이해하지 못한다. ')
위의 루틴에 대한 도움과이 작은 교육 프로젝트를 진행하는 방법에 대한 도움은 정말 감사하겠습니다.
'add ecx, ecx'는 함수가 작동하는 경우 의미가있는 두 개의 ecx를 곱하는 것을 의미합니다. 예를 들어'short' 샘플 (2 바이트)이고 length는 is입니다. 샘플로 표현. – Jack
게시물에 질문을 하나만하십시오. 질문은 "어떻게 nasm 어셈블리를 C로 변환 할 수 있습니까?"라고 가정합니다. "을 수행하는 방법에 대한 제안이 필요합니다."라는 질문이나 "이 코드는 무엇을 하는가"는 주제와 관련이 없습니다. –
BadZen
@ Jack Ok, 루틴이'short *'입력 버퍼를 변경한다고 가정 해 봅시다. 그러나 'loop'는 ecx를 1 씩 감소시키고 있습니까? 이런 맥락에서'ebp'와'edi'의 의미는 무엇입니까? – BPL