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伪指令保证不会生成重复的临时变量名