好文档就是一把金锄头!
欢迎来到金锄头文库![会员中心]
电子文档交易市场
安卓APP | ios版本
电子文档交易市场
安卓APP | ios版本

32位汇编语言——表达式与操作符.ppt

19页
  • 卖家[上传人]:油条
  • 文档编号:26877992
  • 上传时间:2018-01-03
  • 文档格式:PPT
  • 文档大小:446.50KB
  • / 19 举报 版权申诉 马上下载
  • 文本预览
  • 下载提示
  • 常见问题
    • 2018/1/3,1,宋军计算机学院信息安全系songjun@,表达式与操作符,2,2018/1/3,主要内容,汇编语言开发环境MASM32汇编语言程序结构汇编语言的语句格式 汇编语言程序格式MASM伪指令,3,2018/1/3,变量,类型:字节型、字与双字、多字节,结构、枚举存储:全局变量、局部变量,,定义全局变量的时候类型才可以用缩写,4,2018/1/3,全局变量,全局变量的作用域是整个程序,Win32汇编的全局变量定义在 .data或 .data?段内,可以同时定义变量的类型和长度,格式是:,变量名      类型    初始值1,初始值2,……变量名      类型    重复数量 dup (初始值1,初始值2,……),,5,2018/1/3,全局变量的初始化,全局变量在定义中既可以指定初值,也可以只用问号预留空间在 .data?段中,只能用问号预留空间,因为 .data?不能指定初始值实际运行的时候,未初始化的值是0word_Buffer  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,6,2018/1/3,局部变量,两个以上子程序都要用到的数据才被定义为全局变量统一放在数据段中,仅在子程序内部使用的变量则放在堆栈中 在进入子程序的时候,通过修改堆栈指针esp来预留出需要的空间,在用ret指令返回主程序之前,同样通过恢复esp丢弃这些空间 空间是临时分配的,所以无法定义含有初始化值的变量,对局部变量的初始化一般在子程序中由指令完成7,2018/1/3,局部变量的定义,local伪指令必须紧接在子程序定义的伪指令proc后、其他指令开始前 Win32汇编默认的类型是dword,如果定义dword类型的局部变量,则类型可以省略当定义数组的时候,可以 [ ] 括号括起来,不能使用定义全局变量的dup伪指令局部变量不能和已定义的全局变量同名在不同的子程序中可以有同名的局部变量。

      局部变量的起始值是随机的,是其他子程序执行后在堆栈里留下的垃圾,local       变量名1[[重复数量]][:类型],变量名2[[重复数量]][:类型]……,8,2018/1/3,数值表达式,数值表达式一般是指由运算符连接的各种常数所构成的表达式汇编程序在汇编过程中计算表达式,最终得到一个数值程序运行之前,就已经计算出了表达式;所以,程序运行速度没有变慢,但增强程序的可读性MASM对除伪指令外各种汇编时处理的指令统称为操作符(Operator),9,2018/1/3,运算符,算术运算符:+ - * / MOD 移位运算符:SHL SHR逻辑运算符:AND OR NOT XOR 关系运算符:EQ NE GT LT GE LE高低分离符:HIGH LOW HIGHWORD LOWWORD,10,2018/1/3,算术运算符,实现加、减、乘、除、取余的算术运 mov ax,3*4+5 ;等价于 mov ax,17MOD也称为取模,它产生除法之后的余数 19 mod 7 = 5加 + 和减 - 运算符还可以用于地址表达式除加、减外,其他运算符的参数应是整数,11,2018/1/3,逻辑运算符,实现按位相与、相或、异或、求反的逻辑运算 or al,03h AND 45h ;等价于 or al,01h,47H AND 0FH,NOT 56H计算结果分别为:7和0A9H,12,2018/1/3,移位运算符,实现对数值的左移、右移的逻辑操作;移入低位或高位的是0 格式为:数值表达式 SHL/SHR 移位次数 mov al, 0101b SHL (2*2) ;等价于 mov al,01010000b,13,2018/1/3,关系运算符,用于比较和测试符号数值MASM用0FFFFH(补码 -1)表示条件为真,用0000H表示条件为假,mov bx,((PORT LT 5) AND 20) OR ((PORT GE 5)AND 30);当PORT<5时,汇编结果为mov bx,20;否则,汇编结果为mov bx,30,14,2018/1/3,高低分离符,取数值的高半部分或低半部分HIGH、LOW从一个字数值或符号常量中得到高、低字节 mov ah,HIGH 8765h ;等价于mov ah,87h从MASM 6.0引入的HIGHWORD、LOWWORD取一个符号常量(不能是其他常数)的高字或低字部分 dd_value equ 0ffff1234h ;定义一个符号常量 mov ax,LOWWORD dd_value ;等价于mov ax,1234h,15,2018/1/3,其它操作符,类型属性操作符:TYPE长度属性操作符:LENGTH容量属性:SIZE强制属性操作符:PTR存储单元别名操作符:THIS,16,2018/1/3,运算符与操作符的优先级,() [] · LENGTH SIZE PTR OFFSET SEG TPYE THIS HIGE LOW * / MOD SHL SHR + - EQ NE GT LT GE LE NOT AND OR XOR,高低,17,2018/1/3,地址表达式,地址表达式是计算存储单元地址的表达式,它可由标号、变量名和由括号括起来的基址或变址寄存器组成。

      其计算结果表示一个存储单元的地址,而不是该存储单元的值B1,,B1+3,,W1+1,mov al, B1mov al, B1+3mov ax, W1+1,[B1+3],18,2018/1/3,地址操作符,取得名字或标号的段地址和偏移地址两个属性 [ ] 将括起的表达式值作为存储器地址 $ 当前偏移地址 OFFSET 名字/标号 返回名字或标号的偏移地址 : 采用指定的段地址寄存器 SEG 名字/标号 返回名字或标号的段基址,19,2018/1/3,.386.model flat, stdcalloption casemap:none include windows.incinclude kernel32.incincludelib kernel32.lib .dataB1 BYTE 01h, 02h DB 'ABCD'W1 WORD 1234h, 5678h .codestart: mov al, B1 mov al, [B1+1] mov ax, W1+1 mov eax, offset W1 mov 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.text: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 56h,。

      点击阅读更多内容
      关于金锄头网 - 版权申诉 - 免责声明 - 诚邀英才 - 联系我们
      手机版 | 川公网安备 51140202000112号 | 经营许可证(蜀ICP备13022795号)
      ©2008-2016 by Sichuan Goldhoe Inc. All Rights Reserved.