一、变量
程序运行中随之发生变化的结果 保存在可读可写的主存空间中。
变量需要实现定义才能使用,变量表达主存数据即存储器操作数
1、申请存储空间并且进行存储单元初始化
变量名 变量定义伪指令 初值表
【变量定义伪指令】BYTE WORD DWORD FWORD QWORD TBYTE
字节 字 双字 四个字
“?”表示初值不确定即未赋初值
复制操作符 DUP
复制次数 DUP(重复参数)
2、变量定位
“ORG”参数控制存放的偏移地址
org 100h 在偏移地址100h处安排
3.地址操作符
[] 括起来的表达式作为存储器地址指针
$ 返回当前偏移地址
OFFSET 变量名 返回变量名所在段的偏移地址
SEG 变量名 返回段基地址
4.类型操作符
类型名 PTR 变量名 将变量名按照指定的类型使用
TYPE 变量名 返回占用字节空间的字量数值
LENGTHOF 变量名 返回整个变量的数据项数
SIZEOF 变量名 返回整个变量占用字节数
二、数据传送类指令
除标志寄存器传送指令外,均不影响标志位
❀学习指令的注意事项
1.指令的功能
2.指令支持的寻址方式
3.指令对标志的影响
4.指令执行前必须预设的参数、隐含使用的寄存器
1.通用传送指令
mov 目的操作数 源操作数
并非任意传送;双操作数必须类型一致;操作数有明确的类型;双操作数不允许都是主存存储单元;
2.堆栈操作指令
PUSH 数据压入堆栈
POP 数据弹出堆栈
ss指向堆栈段起始位置 ESP指定栈顶
栈顶位于低地址处,数据进入堆栈ESP减小,数据弹出ESP增大
push src
1.ESP=ESP-4
2.SS:[ESP]=src
pop dest
1.dest=ss:[ESP]
2.ESP=ESp+4
将源操作数(立即数、通用寄存器、段寄存器、存储器操作数)传送到当前栈顶
以双字或者字为单位操作ESP-4或者ESP-2
3.换码指令——XLAT
用来实现编码的快速转换
初始条件:在数据段建立一个转换表table,将该表的首地址加载给bx,在al中加载要转换的代码。根据对应关系,将al中的编码适当转化以使与表格中的换码对应,然后执行指令XLAT table
换码指令执行后:将al寄存器的内容转换为目标代码
4.地址传送指令
LEA r16/r32,mem
//r16/r32 <—— mem的有效地址EA(不需要类型一致)
LEA指令类似的地址操作符OFFSET:
LEA指令在执行的过程中计算出偏移地址,而OFFSET操作符在汇编阶段取得变量的偏移地址,无需计算执行速度更快。
LEA指令能获取汇编阶段无法确定的偏移地址
;数据段
dvar dword 41424344h
;代码段
mov eax, dvar //eax=41424344h
lea esi, dvar //esi指向dvar
mov ebx, [esi] //ebx=41424344h
mov edi, offset dvar //edi指向dvar
mov ecx, [edi] //ecx=41424344h
lea edx, [esi+edi*4+100h] //edx=esi+edi*4+100h offset无法获取
5.算数运算指令
1.加法指令
ADD 加法指令
ADC 带进位加法指令
INC 增量指令
除INC不影响进位标志CF以外,其他指令按定义影响全部状态标志位
ADD dest,src //加法:dest=dest+src
寄存器与立即数、寄存器、存储器的加法
存储单元与立即数、寄存器的加法
ADC dest, src //dest=dest+src+CF
用于与ADD指令相结合实现多精度的加法
1.先将两个操作数的低32为相加(ADD)
2.再将高位部分、并将进位加到高位(ADC)
——————————————————————————————————————
mov eax, dword ptr qvar1
add eax, dword ptr qvar2
mov edx, dword ptr qvar1+4
adc adx, dword ptr qvar1+4
只有一个操作数,用于计数器和地址指针的调整
不影响进位CF标志
INC reg/mem // reg/mem++
2.减法指令
SUB 减法指令
SBB 带借位减法指令
DEC 减量指令
NEG 求补指令
CMP 比较指令
除DEC不影响CF标志外其他按定义影响全部状态标志位
SUB dest, src //dest=dest-src
寄存器与立即数、寄存器、存储单元的减法
存储单元与立即数、寄存器的减法
SBB dest, src //dest=dest-src-CF
用于与SUB指令相结合实现多精度数的减法
1.先将两个操作数的低32位相减(SUB)
2.然后减高位部分,并减去借位(SBB)
DEC reg/mem // reg/mem--
用于计数器和地址指针的调整
不影响进位CF标志
NEG reg/mem // reg/mem=0-reg/mem
对标志的影响与零做减法的SUB指令一样
用于求补码或由补码求其绝对值
————————————————————————————————————
mov ax,0ff64h
neg al ;AX=FF9CH,OF=0,SF=1,ZF=0,PF=1,CF=1
sub al,9dh ;AX=FFFFH,OF=0,SF=1,ZF=0,PF=1,CF=1
neg ax ;AX=0001H,OF=0,SF=0,ZF=0,PF=0,CF=1
dec al ;AX=0000H,OF=0,SF=0,ZF=1,PF=1,CF=1
neg ax ;AX=0000H,OF=0,SF=0,ZF=1,PF=1,CF=0
CMP dest, src
将目的操作数减去元操作数,差值不回送操作数,按照减法结果影响状态标志位
根据标志位的状态获知两个操作数的大小关系
3.乘法指令
指令类型 | 操作数组合及其功能 | 举例 |
无符号数乘法 MUL src | AX=AL×r8/m8 DX.AX=AX×r16/m16 EDX.EAX=EAX×r32/m32 | mul bl imul bx mul dvar |
有符号数乘法 IMUL src | ||
双操作数乘法 IMUL dest, src | r16=r16×r16/m16/i8/i16 r32=r32×r32/m32/i8/i32 | imul eax,10 imul ebx, ecx |
三操作数乘法 IMUL dest,src,imm | r16=r16/m16*i8/i16 r32=r32/m32*i8/i32 | imul ax,bx,-2 imul eax,dword ptr [esi+8],5 |
续 汇编语言——数据处理 (2)(第三章)【看我主页里找】
作为笔记使用分开来写了