C nasm代码的实现

BPL

我想开始将一个小的nasm项目{ synth.asmsynth_core.nh }转换为c,以了解更多有关该软合成器的信息。

问题是我的asm知识非常生锈,我想知道从哪里开始。我以为也许一个反编译器可以帮助我,但是我还没有找到能将这些简单的nasm列表转换为c的开源软件。

另一种选择是手动执行转换asm-> c,但是我正在努力理解最简单的功能之一:(

IE:

;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清单是一个非常简单的循环,扭曲了一个简单的音频缓冲区,但是我不知道哪些是输入,哪些是输出,我什至都不了解循环条件:')

上面的例程以及如何完成这个小小的教育项目的任何帮助,将不胜感激。

基因

这里有些猜测:

;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:

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);
}

在C的重新实现中,您可能希望更加明确,并修复零大小缓冲区错误。它不会花费太多:

void distort(struct distortion_control *c, float *a, float *b, unsigned size) {
  for (unsigned n = size; n; --n, ++a) *a = atan2f(*a, c->level) * c->scale;
  for (unsigned n = size; n; --n, ++b) *b = atan2f(*b, c->level) * c->scale;
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

从C名称排序代码转换为NASM汇编代码崩溃

来自分类Dev

在Swift中实现Objective C代码

来自分类Dev

从C代码在Python中实现噪声功能

来自分类Dev

接口声明中的C ++实现代码

来自分类Dev

如何在Linux上从C源代码生成nasm可编译汇编代码?

来自分类Dev

如何在Linux上从C源代码生成nasm可编译汇编代码?

来自分类Dev

Cygwin上的GCC在C代码中使用全局NASM符号时会编译废话

来自分类Dev

如何链接从 C 代码生成的目标文件、静态库和 NASM 生成的目标文件?

来自分类Dev

一行代码中的C strlen()实现

来自分类Dev

了解实现蓝牙低功耗CRC的C代码

来自分类Dev

如何使用C#Parallel.For实现OpenMP多级代码

来自分类Dev

在C ++中通过其伪代码实现算法

来自分类Dev

合并Sort C ++实现,无法识别代码中的错误

来自分类Dev

C ++代码迁移。方法实现总是说缺少类型

来自分类Dev

这个C代码(链表实现)有什么问题?

来自分类Dev

我如何在C中实现此Matlab代码?

来自分类Dev

C ++代码迁移。方法实现总是说缺少类型

来自分类Dev

在C ++中通过其伪代码实现算法

来自分类Dev

如何在 C 代码上实现 MPI 过滤器?

来自分类Dev

C++中的合并排序代码实现

来自分类Dev

为什么 c++ 代码实现的性能不如 python 实现?

来自分类Dev

将C与NASM链接

来自分类Dev

带和不带-std = c99的代码会产生不同的结果(UMAC AE实现)

来自分类Dev

为什么此D代码比类似的C#实现慢?

来自分类Dev

使用JNI或其他工具,是否有可能在Java中实现C代码的反射?

来自分类Dev

c_python源代码中的raw_input在哪里实现?

来自分类Dev

如何导出用C#编写的接口以实现TLB生成的Delphi代码

来自分类Dev

在C中使用MPI实现的SampleSort,代码中未初始化的警告

来自分类Dev

在C ++中实现计时器/股票代码类时需要帮助

Related 相关文章

  1. 1

    从C名称排序代码转换为NASM汇编代码崩溃

  2. 2

    在Swift中实现Objective C代码

  3. 3

    从C代码在Python中实现噪声功能

  4. 4

    接口声明中的C ++实现代码

  5. 5

    如何在Linux上从C源代码生成nasm可编译汇编代码?

  6. 6

    如何在Linux上从C源代码生成nasm可编译汇编代码?

  7. 7

    Cygwin上的GCC在C代码中使用全局NASM符号时会编译废话

  8. 8

    如何链接从 C 代码生成的目标文件、静态库和 NASM 生成的目标文件?

  9. 9

    一行代码中的C strlen()实现

  10. 10

    了解实现蓝牙低功耗CRC的C代码

  11. 11

    如何使用C#Parallel.For实现OpenMP多级代码

  12. 12

    在C ++中通过其伪代码实现算法

  13. 13

    合并Sort C ++实现,无法识别代码中的错误

  14. 14

    C ++代码迁移。方法实现总是说缺少类型

  15. 15

    这个C代码(链表实现)有什么问题?

  16. 16

    我如何在C中实现此Matlab代码?

  17. 17

    C ++代码迁移。方法实现总是说缺少类型

  18. 18

    在C ++中通过其伪代码实现算法

  19. 19

    如何在 C 代码上实现 MPI 过滤器?

  20. 20

    C++中的合并排序代码实现

  21. 21

    为什么 c++ 代码实现的性能不如 python 实现?

  22. 22

    将C与NASM链接

  23. 23

    带和不带-std = c99的代码会产生不同的结果(UMAC AE实现)

  24. 24

    为什么此D代码比类似的C#实现慢?

  25. 25

    使用JNI或其他工具,是否有可能在Java中实现C代码的反射?

  26. 26

    c_python源代码中的raw_input在哪里实现?

  27. 27

    如何导出用C#编写的接口以实现TLB生成的Delphi代码

  28. 28

    在C中使用MPI实现的SampleSort,代码中未初始化的警告

  29. 29

    在C ++中实现计时器/股票代码类时需要帮助

热门标签

归档