Assembly 使用宏查找数字的立方体

Assembly 使用宏查找数字的立方体,assembly,macros,masm,32-bit,irvine32,Assembly,Macros,Masm,32 Bit,Irvine32,如何使用MASM(平面模型)中的宏查找数字立方体。我试过了,但解决不了 这是我的密码: include irvine32.inc Cube MACRO Num push ecx push edx ;call readint mov Num,al mov eax,3 mov ebx,Num mul ebx call writedec call crlf po

如何使用MASM(平面模型)中的宏查找数字立方体。我试过了,但解决不了

这是我的密码:

include irvine32.inc

Cube MACRO Num  
    push ecx    
    push edx
    ;call readint   
    mov Num,al  
    mov eax,3   
    mov ebx,Num     
    mul ebx     
    call writedec   
    call crlf   
    pop edx     
    pop ecx 
ENDM

.data 
    var1 BYTE 3

.code 
main PROC   
    mov eax,Cube(var1)   
    exit 
main ENDP

END main
  • 有关如何编写可以用作指令源操作数的宏,请参见MichaelPetch的注释。您必须告诉它将结果保留在哪个寄存器中

  • 宏将结果打印到标准输出??这不是unixshell,这是汇编语言。您不能从
    var=$(cmd2)
    命令替换中获得结果来捕获stdout,而是将它们留在寄存器中

  • 宏只包含一条
    mul
    指令,因此不能计算任意输入的多维数据集

  • 宏第一次使用其参数时,将其存储到宏中(
    mov Num,al
    ),而不是将其加载到注册表中

  • 如果要对编译时常量进行多维数据集,请不要使用x86指令,也不要使用
    db
    指令将编译时常量放入数据部分。用
    eq
    定义它

    如果您想编写一个宏来放置一系列对输入进行立方体化的指令,那么它至少需要两个参数:一个输入和一个输出

    你最终可能会发出这样的序列

    mov   Result, Num
    imul  Result, Num
    imul  Result, Num
    
    其中,
    Result
    必须是寄存器。或者,如果要使用无符号的
    mul
    ,它没有两个操作数形式,则让宏在
    eax
    中生成结果

    如果加载端口压力是一个问题,或者如果内存操作数使用双参数寻址模式(不能在Intel SnB和更高版本上进行微融合),则可以让宏使用暂存寄存器,这样它只需加载一次


    编写一个宏来推动并弹出以保存regs是一个糟糕的想法。只需将一些临时寄存器作为宏参数传递给它。如果需要,在使用宏的地方溢出/重新加载它们。

    在此显示您的尝试。一:您的宏不能扩展到可以是一个操作数到
    mov
    ,因为它是一个完整的指令序列。它们不会在编译时发生!第二:宏将结果打印到标准输出??这不是unixshell,这是汇编语言。您不能从
    var=$(cmd2)
    命令替换中获得结果来捕获stdout,而是将它们留在寄存器中!三:宏只包含一条
    mul
    指令。第四:宏第一次使用其参数时,您将其存储到宏中(
    mov Num,al
    ),而不是将其加载到注册表中。这意味着我必须将宏1的参数中的两个参数作为输入传递,将宏2作为输出传递。使用MASM,即使使用多行宏,也可以执行类似于
    mov eax,Cube(var1)
    的操作。该键使用EXITM指令来说明返回项是什么(特定寄存器或值)。有了这些信息,它可以预处理类似于
    mov eax,Cube(var1)
    的事情。如果您的宏在ECX中生成一个值,并且您希望该值成为宏的返回寄存器,那么您可以执行
    EXITM
    在我的示例中,您将得到一组发出指令的宏代码(最终在ECX中放置一个值)。然后,宏扩展将像
    mov-eax,Cube(var1)
    这样的行转换为一组发出的汇编代码,然后是
    mov-eax,ecx
    @MichaelPetch:谢谢您的更正。我自己在asm中没有太多使用宏,也从来没有在MASM中使用过宏,所以我只是在猜测它们能做什么。