1、宋军宋军计算机学院信息安全系计算机学院信息安全系表达式与操作符表达式与操作符2022-10-281主要内容主要内容n汇编语言开发环境汇编语言开发环境MASM32n汇编语言程序结构汇编语言程序结构汇编语言的语句格式汇编语言的语句格式 汇编语言程序格式汇编语言程序格式nMASM伪指令伪指令2022-10-282变量变量n类型:字节型、字与双字、多字节,结构、枚举类型:字节型、字与双字、多字节,结构、枚举n存储:全局变量、局部变量存储:全局变量、局部变量定义全局变量的时候类型才可以用缩写 2022-10-283全局变量全局变量n全局变量的作用域是整个程序,全局变量的作用域是整个程序,Win32汇编的
2、全局变量定汇编的全局变量定义在义在.data或或.data?段内,可以同时定义变量的类型和长段内,可以同时定义变量的类型和长度,格式是:度,格式是:变量名 类型 初始值1,初始值2,变量名 类型 重复数量 dup(初始值1,初始值2,)2022-10-284全局变量的初始化全局变量的初始化n全局变量在定义中既可以指定初值,也可以只用问号预留全局变量在定义中既可以指定初值,也可以只用问号预留空间空间n在在.data?段中,只能用问号预留空间,因为段中,只能用问号预留空间,因为.data?不能不能指定初始值。指定初始值。n实际运行的时候,未初始化的值是实际运行的时候,未初始化的值是0。word_B
3、uffer dw 100 dup(1,2);一组字,以一组字,以0001,0002,0001,0002,的的 ;顺序在内存中重复顺序在内存中重复100遍,一共是遍,一共是200个字。个字。szBuffer byte 1024 dup(?);1 024字节的缓冲区字节的缓冲区 ;在在byte类型变量的定义中,用引号定义字符串和数值定义的方法混用类型变量的定义中,用引号定义字符串和数值定义的方法混用 szText db Hello,world!,0dh,0ah,Hello again,0dh,0ah,0 2022-10-285局部变量局部变量n两个以上子程序都要用到的数两个以上子程序都要用到的数据
4、才被定义为全局变量统一放据才被定义为全局变量统一放在数据段中,仅在子程序内部在数据段中,仅在子程序内部使用的变量则放在堆栈中使用的变量则放在堆栈中 n在进入子程序的时候,通过修在进入子程序的时候,通过修改堆栈指针改堆栈指针esp来预留出需要的来预留出需要的空间,在用空间,在用ret指令返回主程序指令返回主程序之前,同样通过恢复之前,同样通过恢复esp丢弃这丢弃这些空间些空间 n空间是临时分配的,所以无法空间是临时分配的,所以无法定义含有初始化值的变量,对定义含有初始化值的变量,对局部变量的初始化一般在子程局部变量的初始化一般在子程序中由指令完成。序中由指令完成。2022-10-286局部变量的
5、定义局部变量的定义nlocal伪指令必须紧接在子程序定义的伪指令伪指令必须紧接在子程序定义的伪指令proc后、其后、其他指令开始前他指令开始前 nWin32汇编默认的类型是汇编默认的类型是dword,如果定义,如果定义dword类型的类型的局部变量,则类型可以省略。局部变量,则类型可以省略。n当定义数组的时候,可以当定义数组的时候,可以 括号括起来,不能使用定义括号括起来,不能使用定义全局变量的全局变量的dup伪指令。伪指令。n局部变量不能和已定义的全局变量同名。局部变量不能和已定义的全局变量同名。n在不同的子程序中可以有同名的局部变量。在不同的子程序中可以有同名的局部变量。n局部变量的起始值
6、是随机的,是其他子程序执行后在堆栈局部变量的起始值是随机的,是其他子程序执行后在堆栈里留下的垃圾里留下的垃圾 local 变量名1重复数量:类型,变量名2重复数量:类型 2022-10-287数值表达式数值表达式n数值表达式一般是指由运算符连接的各种数值表达式一般是指由运算符连接的各种常数所构成的表达式常数所构成的表达式n汇编程序在汇编过程中计算表达式,最终汇编程序在汇编过程中计算表达式,最终得到一个数值得到一个数值n程序运行之前,就已经计算出了表达式;程序运行之前,就已经计算出了表达式;所以,程序运行速度没有变慢,但增强程所以,程序运行速度没有变慢,但增强程序的可读性序的可读性nMASM对除
7、伪指令外各种汇编时处理的指对除伪指令外各种汇编时处理的指令统称为操作符(令统称为操作符(Operator)2022-10-288运算符运算符n算术运算符:算术运算符:+-*/MOD n移位运算符:移位运算符:SHL SHRn逻辑运算符:逻辑运算符:AND OR NOT XOR n关系运算符:关系运算符:EQ NE GT LT GE LEn高低分离符:高低分离符:HIGH LOW HIGHWORD LOWWORD2022-10-289算术运算符算术运算符n实现加、减、乘、除、取余的算术运实现加、减、乘、除、取余的算术运mov ax,3*4+5;等价于等价于 mov ax,17nMOD也称为取模,
8、它产生除法之后的余数也称为取模,它产生除法之后的余数19 mod 7=5n加加+和减和减-运算符还可以用于地址表达式运算符还可以用于地址表达式n除加、减外,其他运算符的参数应是整数除加、减外,其他运算符的参数应是整数2022-10-2810逻辑运算符逻辑运算符n实现按位相与、相或、异或、求反的逻辑实现按位相与、相或、异或、求反的逻辑运算运算 or al,03h AND 45h ;等价于等价于 or al,01h47H AND 0FH,NOT 56H计算结果分别为:7和0A9H 2022-10-2811移位运算符移位运算符n实现对数值的左移、右移的逻辑操作;移实现对数值的左移、右移的逻辑操作;移
9、入低位或高位的是入低位或高位的是0格式为:格式为:数值表达式数值表达式 SHL/SHR 移位次数移位次数mov al,0101b SHL(2*2);等价于等价于 mov al,01010000b2022-10-2812关系运算符关系运算符n用于比较和测试符号数值用于比较和测试符号数值nMASM用用0FFFFH(补码(补码-1)表示条)表示条件为真,用件为真,用0000H表示条件为假表示条件为假mov bx,(PORT LT 5)AND 20)OR(PORT GE 5)AND 30);当当PORT5时,汇编结果为时,汇编结果为mov bx,20;否则,汇编结果为否则,汇编结果为mov bx,30
10、2022-10-2813高低分离符高低分离符n取数值的高半部分或低半部分取数值的高半部分或低半部分nHIGH、LOW从一个字数值或符号常量中得到高、从一个字数值或符号常量中得到高、低字节低字节mov ah,HIGH 8765h;等价于等价于mov ah,87hn从从MASM 6.0引入的引入的HIGHWORD、LOWWORD取一个符号常量(不能是其他常数)的高字或低取一个符号常量(不能是其他常数)的高字或低字部分字部分 dd_value equ 0ffff1234h;定义一个符号常量定义一个符号常量mov ax,LOWWORD dd_value;等价于等价于mov ax,1234h2022-1
11、0-2814其它操作符其它操作符n类型属性操作符:类型属性操作符:TYPEn长度属性操作符:长度属性操作符:LENGTHn容量属性:容量属性:SIZEn强制属性操作符:强制属性操作符:PTRn存储单元别名操作符:存储单元别名操作符:THIS2022-10-2815运算符与操作符的优先级运算符与操作符的优先级()LENGTH SIZEPTR OFFSET SEG TPYE THIS HIGE LOW*/MOD SHL SHR+-EQ NE GT LT GE LENOTANDOR XOR高低2022-10-2816地址表达式地址表达式n地址表达式是计算存地址表达式是计算存储单元地址的表达式,储单元
12、地址的表达式,它可由它可由标号、变量名标号、变量名和由括号括起来的基和由括号括起来的基址或变址寄存器址或变址寄存器组成。组成。其计算结果表示一个其计算结果表示一个存储单元的地址,而存储单元的地址,而不是该存储单元的值。不是该存储单元的值。B1DB10H,11H,12HDB ABCDW1DW1234H,5678H101112ABCD34127856B1B1+3W1+1mov al,B1mov al,B1+3mov ax,W1+1B1+32022-10-2817地址操作符地址操作符n取得名字或标号的段地址和偏移地址两个取得名字或标号的段地址和偏移地址两个属性属性 将括起的表达式值作为存储器地址将括
13、起的表达式值作为存储器地址$当前偏移地址当前偏移地址OFFSET 名字名字/标号标号 返回名字或标号的偏移地址返回名字或标号的偏移地址 :采用指定的段地址寄存器采用指定的段地址寄存器 SEG 名字名字/标号标号 返回名字或标号的段基址返回名字或标号的段基址2022-10-2818.386.model flat,stdcalloption casemap:noneinclude windows.incinclude kernel32.incincludelib kernel32.lib.dataB1BYTE01h,02hDBABCDW1 WORD1234h,5678h.codestart:mov
14、 al,B1mov al,B1+1mov ax,W1+1mov eax,offset W1mov eax,$invoke ExitProcess,NULLend start.text:00401000 public start.text:00401000 start proc near.text:00401000 mov al,byte_403000.text:00401005 mov al,byte_403001.text:0040100A mov ax,word_403007.text:00401010 mov eax,offset unk_403006.text:00401015.tex
15、t:00401015 loc_401015:.text:00401015 mov eax,offset loc_401015.text:0040101A push 0 ;uExitCode.text:0040101C call ExitProcess.text:0040101C start endp.data:00403000 byte_403000 db 1.data:00403001 byte_403001 db 2.data:00403002 db 41h;A.data:00403003 db 42h;B.data:00403004 db 43h;C.data:00403005 db 44h;D.data:00403006 unk_403006 db 34h.data:00403007 word_403007 dw 7812h.data:00403009 db 56h2022-10-2819