DSP

【ASM】函数变量定义

2019-07-13 18:23发布

asm参量一般定义在数据段下。今天用vc++带的cl编译cpp文件生成asm代码后发现另一种定义参量方式,意义同直接定义在.data数据节中。 可以如下定义: print_esp proc _DATAS segment szfmt1 db '这是1 esp=%p',13,10,0 szfmt2 db '这是2 esp=%p',13,10,0 x DWORD 0h _DATAS ends push ebp mov ebp,esp push esp push offset szfmt2 call crt_printf add esp,8 leave ret print_esp endp 说明:     1、_DATAS 可以定义为任意名字     2、定义的符号(szfmt1,szfmt2,x等)不能在其它函数或.data节中定义的符号同名     3、使用此种方式不能同local伪指令同时使用 注: cpp生成相应的asm方式: cl.exe xx.cpp /FA 20181201  以上方式建立的变量名不能重复且不必要,有没有能如c++中那像随意定义局部变量,随用随定义呢?当然是可以的,这得益于data段的定义灵活,可以在任何需要的时候定义。借助于宏汇编可以实现如c++中的局部变量效果。 定义宏如下: mks macro s:VARARG local s1 .data s1 db s .code exitm endm mksnl macro s local s1 .data s1 db s,13,10,0 .code exitm endm 修改后的print_esp实现: print_esp proc push ebp mov ebp,esp push esp push mks('这是11 esp=%p',13,10,0) call crt_printf add esp,8 invoke crt_printf,mksnl('这是22 esp=%p'),esp leave ret print_esp endp 由此可见,借助宏改进后的程序,显得更为直观,整洁,易懂,书写也更为方便。更重要的是不用再担心变量的命名问题,local伪指令保证不会生成重复的临时变量名