我是用在别的语言的内嵌汇编,这个语言直接支持置入汇编的机器码,所以我都是在外面写好了功能,生成机器码再调用。
而为了方便,该语言在每个子程序进入前都隐含的执行了ENTER,也就是 push ebp, mov ebp,esp 这个;
换句话说,我这里运行的汇编代码实际上就是masm中的一个子程序而已:
子程序 PROC
push ebp
mov ebp,esp ;这两句默认就有了,是隐藏的看不见
可以写入汇编的机器码……
子程序 ENDP
当然,我可以直接在第一句来个leave让他隐含的指令回去,但是一般没什么意义。。。哦说多了,这些都不是我想问的;
我只是在表达,这里仅仅是汇编中.code中的一个小小的proc,我应该不可以像完整的汇编代码那样声明一个全局的字符串变量:
变量 db "我要声明的字符串", 0
貌似这样是不行的,关于这个问题其实我搜索了好长时间都没有比较明确的答案。。。
比如masm32中带了一些宏,在那个“macros.asm”文件里,比如CTXT,CADD,szText 这些都是用于字符串的,但是我试了试不好用(或许是我不会用,也没找到具体演示的例子),首先我不是把字符串向API里传递参数,我最大的需求的将其放入esi或edi中(当然放的是字符串地址啦);
假设我要在这个子程序中产生一个字符串:"abcabc",我现在只知道最笨的办法:
local @txt[7]:byte
然后将其每个字节赋值为ASCII:61h, 62h, 63h, 61h, 62h, 63h, 0
也就是说我得写7句指令。。。我晕,我觉得肯定有比这个正常的方法吧?要是我的字符串长一些,那可咋整啊?
请前辈教教我:在子程序中声明一个字符串变量,并将其地址赋值给esi即可。。。
万分感激!
------解决思路----------------------
.386
.model flat, stdcall
.code
start:
jmp next
szStr db "12345678", 0
next:
call getPtr
getPtr:
pop esi
add esi, -14 ;call getPtr opcode长度5字节+字符串长度9字节
end start
end