往期:
目录
通用数据处理指令
数据传送指令
MOV
1、立即数传送
2、寄存器传送
3、存储器传送
4、段寄存器传送
地址传送指令
LEA
地址传送指令获取存储器操作数的地址
地址传送程序
; eg0302.asm in Windows Console
include io32.inc
.data
dvar dword 41424344h
.code
start:
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
call disprd
exit 0
end start
堆栈操作指令
PUSH POP
堆栈存取原则:先进后出
进栈指令PUSH
注:只支持字类操作
举例:
出栈指令POP
举例:
堆栈操作程序:
; eg0301.asm in Windows Console
include io32.inc
.data
ten = 10
dvar dword 67762000h,12345678h
.code
start:
mov eax,dvar+4 ;EAX=12345678H
push eax ;将EAX内容压入堆栈
push dword ptr ten ;将立即数以双字量压入堆栈
push dvar ;将变量DVAR第一个数据压入堆栈
pop eax ;栈顶数据弹出到EAX
pop dvar+4 ;栈顶数据弹出到DVAR+4位置
mov ebx,dvar+4 ;EBX=000000AH
pop ecx ;栈顶数据弹出到ECX
call disprd
exit 0
end start
分析:
1、入栈
2、出栈
运行结果
算数运算类指令
状态标志
状态标志是处理器最基本的标志
一方面:作为加减运算和逻辑运算的辅助结果
另一方面:构成各种条件,实现程序的分支
进位标志CF
无符号数最高有效位有进位(加法)或借位(减法)时,进位标志置1,即CF=1;否则CF=0.
举例-1
举例-2
溢出标志OF
有符号数加减结果有溢出,则OF=1,否则OF=0
举例-1
举例-2
溢出人工判断:
只有当两个相同符号数相加(或两个不同符号数相减),而运算结果的符号与原数据符号相反时,产生溢出
其他情况下不会溢出
进位和溢出的区别
零标志ZF
运算结果位0,则ZF=1,否则ZF=0
举例
符号标志SF
运算结果最高位为1,则SF=1;否则SF=0
举例
奇偶标志PF
当运算结果最低字节中“1”的个数为零或偶数时,PF=1;负责PF=0
仅最低8位的 “1”的个数
举例
对状态标志影响的主要指令
加减运算指令、逻辑运算指令、移位指令等
加法指令
加法指令ADD
带进位的加法指令ADC
增量指令INC
注:
除INC不影响进位标志CF外,其他指令全部影响状态标志位
加法指令ADD
8位加法
16位加法
32位加法
大小写字母转换可以使用ADD
小写 = 大写 + 20H
减法指令
减法指令SUB
带借位的减法指令SBB
减量指令DEC
求补指令NEG
比较指令CMP
注:
除DEC不影响CF标志外,其他都影响全部状态标志
减法指令SUB
8位减法
16位减法
32位减法
大小写字母的转换可以使用SUB
大写 = 小写 - 20H
增量指令INC
减量指令DEC
求补指令NEG
举例
位操作指令
逻辑与指令AND
逻辑或指令OR
逻辑非指令NOT
逻辑异或指令XOR
逻辑运算程序
; eg0307.asm in Windows Console
include io32.inc
.data
varA dword 11001010000111100101010101001101b
varB dword 00110111010110100011010111100001b
varT1 dword ?
varT2 dword ?
.code
start:
mov eax,varA ;EAX=11001010000111100101010101001101B
not eax ;EAX=00110101111000011010101010110010B
and eax,varB ;EAX=00110101010000000010000010100000B
mov ebx,varB ;EBX=00110111010110100011010111100001B
not ebx ;EBX=11001000101001011100101000011110B
and ebx,varA ;EBX=11001000000001000100000000001100B
or eax,ebx ;EAX=11111101010001000110000010101100B
mov varT1,eax
;
mov eax,varA
xor eax,varB ;EAX=11111101010001000110000010101100B
mov varT2,eax
;
mov eax,varT1 ;二进制形式显示VART1
call dispbd
call dispcrlf ;换行显示
mov eax,varT2 ;二进制形式显示VART2
call dispbd
exit 0
end start
逻辑运算的屏蔽作用
逻辑运算用于大小写转换
大写 = 小写 ADN DFH
小写 = 大写 OR 20H
逻辑运算用于清零
xor edx, edx ;同时将CF和OF都清零了,只影响ZF,SF,PF
and edx 0 ;同时将CF和OF都清零了,只影响ZF,SF,PF
sub edx, edx ;影响全部标志位
mov edx, 0 ;不影响标志位
移位指令
逻辑左移指令SHL/算术左移指令SAL
算术左移和逻辑左移完成的功能是完全一样的
举例:
逻辑右移指令SHR
算术右移指令SAR
循环移位指令
不带进位循环左移指令ROL
最高位空出来的'1',同时进入CF和最低为空出来的位置
不带进位的循环右移指令ROR
带进位循环左移指令RCR
带进位循环右移指令RCR