Assembly 使用宏查找数字的立方体
如何使用MASM(平面模型)中的宏查找数字立方体。我试过了,但解决不了 这是我的密码: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
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
var=$(cmd2)
命令替换中获得结果来捕获stdout,而是将它们留在寄存器中mul
指令,因此不能计算任意输入的多维数据集mov Num,al
),而不是将其加载到注册表中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中使用过宏,所以我只是在猜测它们能做什么。