3-简单传送,加减指令&标志寄存器
一、简单传送指令

- 示例
MOV EAX, 12345678H //EAX = 12345678H
MOV EBX, EAX //EBX = 12345678H
MOV ESI, 256 //ESI = 00000100H
MOV ECX, -1 //ECX = FFFFFFFFH
MOV BX, ‘b’ //EBX = 12340062H
MOV AH, AL //EAX = 12347878H
MOV CX, AX //ECX = FFFF7878H
MOV AX, SI //EAX = 12340100H
MOV SI, BX //ESI = 00000062H
MOV AL, BH //EAX = 12340100H

- 示例
XCHG AL, AH //8位交换
XCHG SI, BX //16位交换
XCHG EAX, EBX //32位交换
XCHG AL, [EBX] //AL与由EBX指定的字节存储单元交换
XCHG [ESI], BX //BX与由ESI指定的字存储单元交换
XCHG EDX, [EDI] //EDX与由EDI指定的双字存储单元交换
二、加减指令

- 示例
ADD ECX,200 //使ECX加上200
ADD EBX,ECX //使EBX加上ECX的值
ADD SI,10 //使SI加上10
ADD DH,DL //使DH加上DL的值
ADD AL,5 //使AL加上5
ADD EAX,[EBX] //使EAX加上EBX的值指定的存储单元的值


示例:
SUB EDX,1000 //使EDX减去1000
SUB ESI,EBX //使ESI减去EBX值
SUB DI,20 //使DI减去20
SUB DH,CL //使DH减去CL值
SUB AL,7 //使AL减去7
SUB ECX,[EDI] //使ECX减去由EDI指定的双字存储单元值

示例:
INC ESI //使寄存器ESI值加1
INC DI //使寄存器DI值加1
INC CL //使寄存器CL值加1

示例:
DEC EDI //使寄存器EDI值减1
DEC SI //使寄存器SI值减1
DEC AL //使寄存器AL值减1

示例:
MOV AL,3 //AL=03H
NEG AL //AL=FDH(-3)
MOV EDX,-5 //EDX=FFFFFFFBH
NEG EDX //EDX=00000005H

示例:
/*
dp26
利用带符号加法ADC,处理可能产生的进位
*/
#include<stdio.h>
int main()
{
unsigned char v1 = 188, v2 = 172, v3 = 233; //3个字节变量
unsigned int sum = 0;
_asm
{
XOR EDX,EDX //EDX清零,DX用于存放累加和
ADD DL,v1 //加第一个字节
ADC DH,0 //高8位相加
ADD DL, v2 //加第二个字节
ADC DH, 0 //高8位相加(意在处理进位)
ADD DL, v3 //加第三个字节
ADC DH, 0 //高8位相加(意在处理进位)
MOV sum,EDX
}
// 通过ADC带位加法,使得可以保证处理进位,将仅为成功加到高位中
printf("sum=%u\n", sum);
system("pause");
return 0;
}

示例:
MOV AX,620H
SUB AL,21H //AX=06FFH, CF=1
SBB AH,2 //AX=03FFH,CF=0 (注意这里CF的影响)
SBB AH,2 //AX=01FFH,CF=0
三、标志寄存器及使用
1. 标志寄存器
- 一个32位寄存器
- 用于反映处理器的状态和运算结果的某些特征
- 可以暂时认为主要是:状态标志 & 控制标志
- 低16位对应8086的FLAGS寄存器


2. 状态标志
(1)CF进借位标志


(2)ZF零标志


(3)SF符号标志


(4)OF溢出标志



浙公网安备 33010602011771号