Win32汇编语言-表达式与操作符
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
2013-7-12
10
逻辑运算符
实现按位相与、相或、异或、求反的逻辑 运算 or al,03h AND 45h ;等价于 or al,01h
47H AND 0FH,NOT 56H 计算结果分别为:7和0A9H
2013-7-12
11
移位运算符
实现对数值的左移、右移的逻辑操作;移 入低位或高位的是0 格式为: 数值表达式 SHL/SHR 移位次数 mov al, 0101b SHL (2*2) ;等价于 mov al,01010000b
.data B1 W1 .code start: mov al, B1 mov al, [B1+1] mov ax, W1+1 mov eax, offset W1 mov eax, $ invoke ExitProcess, NULL end start
BYTE DB WORD
01h, 02h 'ABCD' 1234h, 5678h
2013-7-12
19
.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
OFFSET 名字/标号 返回名字或标号的偏移地址
: 采用指定的段地址寄存器
SEG 名字/标号 返回名字或标号的段基址
2013-7-12
18
.386 .model flat, stdcall option casemap:none
include windows.inc include kernel32.inc includelib kernel32.lib
2013-7-12 8
运算符
算术运算符:+ - * / MOD 移位运算符:SHL SHR 逻辑运算符:AND OR NOT XOR 关系运算符:EQ NE GT LT GE LE 高低分离符:HIGH LOW HIGHWORD LOWWORD
2013-7-12
9
算术运算符
实现加、减、乘、除、取余的算术运 mov ax,3*4+5 ;等价于 mov ax,17 MOD也称为取模,它产生除法之后的余数 19 mod 7 = 5 加 + 和减 - 运算符还可以用于地址表达式 除加、减外,其他运算符的参数应是整数
word_Buffer dw szBuffer byte
; 在byte类型变量的定义中,用引号定义字符串和数值定义的方法混用
szText db 'Hello,world!',0dh,0ah,'Hello again',0dh,0ah,0
2013-7-12
5
局部变量
两个以上子程序都要用到的数 据才被定义为全局变量统一放 在数据段中,仅在子程序内部 使用的变量则放在堆栈中 在进入子程序的时候,通过修 改堆栈指针esp来预留出需要的 空间,在用ret指令返回主程序 之前,同样通过恢复esp丢弃这 些空间 空间是临时分配的,所以无法 定义含有初始化值的变量,对 局部变量的初始化一般在子程 序中由指令完成。
2013-7-12
13
高低分离符
取数值的高半部分或低半部分 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
2013-7-12
14
其它操作符
类型属性操作符:TYPE 长度属性操作符:LENGTH 容量属性:SIZE 强制属性操作符:PTR 存储单元别名操作符:THIS
2013-7-12
15
运算符与操作符的优先级
() <> [] · LENGTH SIZE
高
PTR OFFSET SEG TPYE THIS HIGE LOW * / MOD SHL SHR + -
Fra Baidu bibliotek
.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
2013-7-12
6
局部变量的定义
local
变量名1[[重复数量]][:类型],变量名2[[重复数量]][:类型]……
local伪指令必须紧接在子程序定义的伪指令proc后、其 他指令开始前 Win32汇编默认的类型是dword,如果定义dword类型的 局部变量,则类型可以省略。 当定义数组的时候,可以 [ ] 括号括起来,不能使用定义 全局变量的dup伪指令。 局部变量不能和已定义的全局变量同名。 在不同的子程序中可以有同名的局部变量。 局部变量的起始值是随机的,是其他子程序执行后在堆栈 里留下的垃圾
W1
DW
mov al, B1 mov al, B1+3 mov ax, W1+1
… 10 11 12 'A' 'B' 'C' 'D' 34 12 78 56 …
B1 [B1+3]
2013-7-12
B1+3
W1+1
17
地址操作符
取得名字或标号的段地址和偏移地址两个 属性 [ ] 将括起的表达式值作为存储器地址 $ 当前偏移地址
2013-7-12
4
全局变量的初始化
全局变量在定义中既可以指定初值,也可以只用问号预留 空间 在 .data?段中,只能用问号预留空间,因为 .data?不能 指定初始值。 实际运行的时候,未初始化的值是0。
100 dup (1,2) ; 一组字,以0001,0002,0001,0002,…的 ; 顺序在内存中重复100遍,一共是200个字。 1024 dup (?) ; 1 024字节的缓冲区
表达式与操作符
宋军 计算机学院信息安全系 songjun@cug.edu.cn
2013-7-12 1
主要内容
汇编语言开发环境
MASM32
汇编语言程序结构
汇编语言的语句格式 汇编语言程序格式
MASM伪指令
2013-7-12
2
变量
类型:字节型、字与双字、多字节,结构、枚举 存储:全局变量、局部变量
2013-7-12
12
关系运算符
用于比较和测试符号数值 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
定义全局变 量的时候类 型才可以用 缩写
2013-7-12
3
全局变量
全局变量的作用域是整个程序,Win32汇编的全局变量定 义在 .data或 .data?段内,可以同时定义变量的类型和长 度,格式是:
变量名 变量名 类型 类型 初始值1,初始值2,…… 重复数量 dup (初始值1,初始值2,……)
2013-7-12
7
数值表达式
数值表达式一般是指由运算符连接的各种 常数所构成的表达式 汇编程序在汇编过程中计算表达式,最终 得到一个数值 程序运行之前,就已经计算出了表达式; 所以,程序运行速度没有变慢,但增强程 序的可读性 MASM对除伪指令外各种汇编时处理的指 令统称为操作符(Operator)
EQ NE GT LT GE LE
NOT
低
AND
OR XOR
2013-7-12
16
地址表达式
地址表达式是计算存 储单元地址的表达式, 它可由标号、变量名 和由括号括起来的基 址或变址寄存器组成。 其计算结果表示一个 存储单元的地址,而 不是该存储单元的值。
B1
DB DB
10H, 11H, 12H 'ABCD' 1234H, 5678H