【文档说明】Win32汇编语言-表达式与操作符课件.ppt,共(19)页,444.001 KB,由小橙橙上传
转载请保留链接:https://www.ichengzhen.cn/view-44740.html
以下为本文档部分文字说明:
2022/11/241宋军计算机学院信息安全系songjun@cug.edu.cn表达式与操作符22022/11/24主要内容汇编语言开发环境MASM32汇编语言程序结构汇编语言的语句格式汇编语言程序格式MASM伪指令32022/11/24变量类型:字节型、字与双字、多字节
,结构、枚举存储:全局变量、局部变量定义全局变量的时候类型才可以用缩写42022/11/24全局变量全局变量的作用域是整个程序,Win32汇编的全局变量定义在.data或.data?段内,可以同时定义变
量的类型和长度,格式是:变量名类型初始值1,初始值2,……变量名类型重复数量dup(初始值1,初始值2,……)52022/11/24全局变量的初始化全局变量在定义中既可以指定初值,也可以只用问号预留空间在.dat
a?段中,只能用问号预留空间,因为.data?不能指定初始值。实际运行的时候,未初始化的值是0。word_Bufferdw100dup(1,2);一组字,以0001,0002,0001,0002,…的;顺序在内存中重复100遍,一共是200
个字。szBufferbyte1024dup(?);1024字节的缓冲区;在byte类型变量的定义中,用引号定义字符串和数值定义的方法混用szTextdb'Hello,world!',0dh,0ah,'Helloagai
n',0dh,0ah,062022/11/24局部变量两个以上子程序都要用到的数据才被定义为全局变量统一放在数据段中,仅在子程序内部使用的变量则放在堆栈中在进入子程序的时候,通过修改堆栈指针esp来预留出需要的空间,在用ret指令返回主程序之前,同样通过恢复esp丢弃这些空间
空间是临时分配的,所以无法定义含有初始化值的变量,对局部变量的初始化一般在子程序中由指令完成。72022/11/24局部变量的定义local伪指令必须紧接在子程序定义的伪指令proc后、其他指令开始前Win32汇编默认的类型是dword,如果定义dword类型的局部变
量,则类型可以省略。当定义数组的时候,可以[]括号括起来,不能使用定义全局变量的dup伪指令。局部变量不能和已定义的全局变量同名。在不同的子程序中可以有同名的局部变量。局部变量的起始值是随机的,是其他子程序执行后在堆栈里留下的垃圾local变量名1[[重复数量]][:类型],变量名2
[[重复数量]][:类型]……82022/11/24数值表达式数值表达式一般是指由运算符连接的各种常数所构成的表达式汇编程序在汇编过程中计算表达式,最终得到一个数值程序运行之前,就已经计算出了表达式;所以,程序运行速度没有变慢,但增强程序的可读性MASM对除伪指令外各种汇编时处
理的指令统称为操作符(Operator)92022/11/24运算符算术运算符:+-*/MOD移位运算符:SHLSHR逻辑运算符:ANDORNOTXOR关系运算符:EQNEGTLTGELE高低分离符:HI
GHLOWHIGHWORDLOWWORD102022/11/24算术运算符实现加、减、乘、除、取余的算术运movax,3*4+5;等价于movax,17MOD也称为取模,它产生除法之后的余数19mod7=5加+和减-运算符还可以用于地址表达式除加、减外,其他运算符的参数应是整数
112022/11/24逻辑运算符实现按位相与、相或、异或、求反的逻辑运算oral,03hAND45h;等价于oral,01h47HAND0FH,NOT56H计算结果分别为:7和0A9H122022/11/24移位运算符实现对数值的左移、右移的逻辑操作;移入低位或高位的是0格式
为:数值表达式SHL/SHR移位次数moval,0101bSHL(2*2);等价于moval,01010000b132022/11/24关系运算符用于比较和测试符号数值MASM用0FFFFH(补码-1)表示条件为真,用0000H表示条件为假movbx,((PORTLT5
)AND20)OR((PORTGE5)AND30);当PORT<5时,汇编结果为movbx,20;否则,汇编结果为movbx,30142022/11/24高低分离符取数值的高半部分或低半部分HIGH、LOW从一个字数值或符号常量中得到高、低字节movah
,HIGH8765h;等价于movah,87h从MASM6.0引入的HIGHWORD、LOWWORD取一个符号常量(不能是其他常数)的高字或低字部分dd_valueequ0ffff1234h;定义一个符号常量movax,LOWWORDdd_
value;等价于movax,1234h152022/11/24其它操作符类型属性操作符:TYPE长度属性操作符:LENGTH容量属性:SIZE强制属性操作符:PTR存储单元别名操作符:THIS162022/11/
24运算符与操作符的优先级()<>[]·LENGTHSIZEPTROFFSETSEGTPYETHISHIGELOW*/MODSHLSHR+-EQNEGTLTGELENOTANDORXOR高低172022/11/24地址
表达式地址表达式是计算存储单元地址的表达式,它可由标号、变量名和由括号括起来的基址或变址寄存器组成。其计算结果表示一个存储单元的地址,而不是该存储单元的值。B1DB10H,11H,12HDB'ABCD'W1DW1234
H,5678H…101112'A''B''C''D'34127856…B1B1+3W1+1moval,B1moval,B1+3movax,W1+1[B1+3]182022/11/24地址操作符取得名字或标号的段地址和
偏移地址两个属性[]将括起的表达式值作为存储器地址$当前偏移地址OFFSET名字/标号返回名字或标号的偏移地址:采用指定的段地址寄存器SEG名字/标号返回名字或标号的段基址192022/11/24.386.modelflat,stdcallopt
ioncasemap:noneincludewindows.incincludekernel32.incincludelibkernel32.lib.dataB1BYTE01h,02hDB'ABCD'W1WORD12
34h,5678h.codestart:moval,B1moval,[B1+1]movax,W1+1moveax,offsetW1moveax,$invokeExitProcess,NULLendstart.text
:00401000publicstart.text:00401000startprocnear.text:00401000moval,byte_403000.text:00401005moval,byt
e_403001.text:0040100Amovax,word_403007.text:00401010moveax,offsetunk_403006.text:00401015.text:00401015loc_401015:.text:00401015
moveax,offsetloc_401015.text:0040101Apush0;uExitCode.text:0040101CcallExitProcess.text:0040101Cstart
endp.data:00403000byte_403000db1.data:00403001byte_403001db2.data:00403002db41h;A.data:00403003db42h;B.data:00403004db43h;C.data:00403005db44h;D.da
ta:00403006unk_403006db34h.data:00403007word_403007dw7812h.data:00403009db56h