【ASM】函数变量定义

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 <offset s1>
endm

mksnl macro s
	local s1
	.data
		s1 db s,13,10,0
	.code
		exitm <offset s1>
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伪指令保证不会生成重复的临时变量名 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值