使用MASM07
让编程改变世界
Change the world by program
标号、变量和数据结构
当程序中要跳转到另一位置时,需要有一个标识来指示位置,这就是标号。 通过在目的地址的前面放上一个标号,可以在指令中使用标号来代替直接使用地址。 关于变量的使用是任何编程语言都要遇到的工作,Win32汇编也不例外,在MASM中使用变量也有需要注意的几个问题,错误地使用变量定义或用错误的方法初始化变量会带来难以定位的错误。 变量是计算机内存中已命名的存储位置,在C语言中有很多种类的变量,如整数型、浮点型和字符型等,不同的变量有不同的用途和尺寸。 比如说虽然长整数和单精度浮点数都是32位长,但它们的用途不同。 变量的值在程序运行中是经常改变的,所以它必须定义在可写的段内,如.data和.data,或者在堆栈内。 按照定义的位置不同,MASM中的变量也分为全局变量和局部变量两种。在MASM中标号和变量的命名规范是相同的,它们是:
– 1)可以用字母、数字、下划级及符号@、$和。
– 2)第一个符号不能是数字。
– 3)长度不能超过240个字符。
– 4)不能使用指令名等关键字。
– 5)在作用域内必须是唯一的。
这些规则是大部分编程语言约定俗成的!标号的定义
当在程序中使用一条跳转指令的时候,可以用标号来表示跳转的目的地,编译器在编译的时候会把它替换成地址。 标号既可以定义在目的指令同一行的头部,也可以在目的指令前一行单独用一行定义,标号定义的格式是:– 格式一 标号名: 目的指令
– 格式二 标号名:: 目的指令
我们比较常用的方法是使用格式一(一个冒号那个),注意这时候标号的作用域是当前的子程序,在不同子程序中可以存在同样名字的标号。 这也就意味着这种格式不能从一个子程序通过标号跳转到另一个子程序中。 那如果实在痒,想跳,怎么办? 格式二就应运而生了!没错,当我们需要从一个子程序中用指令跳到另一个子程序中的标号位置时候,我们用格式二,但代码并不和谐!@@
OK,大家一定想到了很多类似的肥猪流火星文***符号,很高兴我们学Win32汇编居然赶上了时代的主流阿,尼玛啊,有木有啊! 在DOS时代,为标号起名是个麻烦的事情,因为汇编指令用到跳转指令特别多,任何比较和测试等都要涉及跳转,所以在程序中会有很多标号, 在整个程序范围内起个不重名的标号要费一番功夫,结果常常用addr1和addr2之类的标号一直延续下去…… 事实上很多标号会使用一到两次,而且不一定非要起个有意义的名称,如汇编程序中下列代码结构很多: [codesyntax lang="asm"]mov cx,1234h cmp flag,1 je loc1 mov cx,1000h loc1: loop loc1[/codesyntax] 在别的地方事实上就不会用到loc1了,尼玛啊,编程要讲究低碳,低碳啊,有木有?! 对于这种不环保的做法,我们用@@来取而代之!程序改下如下: [codesyntax lang="asm"]
mov cx,1234h cmp flag,1 je @F mov cx,1000h @@: loop @B // B 这里是Before的意思[/codesyntax] 是不是既方便,又美观?! 当用@@做标号时,@F表示本条指令后的第一个@@标号,@B表示本条指令前的第一个@@标号。 注意,当程序中可以有多个@@标号,@B和@F只寻找匹配最近的一个。 不要在间隔太远的代码中使用@@标号,因为在以后的修改中@@和@B,@F中间可能会被无意中插入一个新的@@。 这样一来,@B或@F就会引用到错误的地方去,距离最好限制在编辑器能够显示的同一屏幕的范围内。 [buy] 获得所有教学视频、课件、源代码等资源打包 [/buy] [Downlink href='http://urlxf.qq.com/?fi6RRn2']视频下载[/Downlink]