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

一、简单传送指令

1747051478856.webp

  • 示例
1
2
3
4
5
6
7
8
9
10
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

1747051629241.webp

  • 示例
1
2
3
4
5
6
7
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指定的双字存储单元交换

二、加减指令

1747051822803.webp

  • 示例
1
2
3
4
5
6
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的值指定的存储单元的值

1747051907692.webp

1747057025764.webp
示例:

1
2
3
4
5
6
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指定的双字存储单元值

1747057112278.webp
示例:

1
2
3
INC    ESI 	//使寄存器ESI值加1
INC DI //使寄存器DI值加1
INC CL //使寄存器CL值加1

1747057173044.webp
示例:

1
2
3
DEC   EDI     //使寄存器EDI值减1
DEC SI //使寄存器SI值减1
DEC AL //使寄存器AL值减1

1747057279293.webp
示例:

1
2
3
4
MOV   AL,3       //AL=03H
NEG AL //AL=FDH(-3)
MOV EDX,-5 //EDX=FFFFFFFBH
NEG EDX //EDX=00000005H

1747057360282.webp
示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
/*
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;
}

1747057421118.webp
示例:

1
2
3
4
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寄存器
    1747057567052.webp
    1747057610001.webp

2. 状态标志

(1)CF进借位标志
1747057727585.webp
1747057749584.webp

(2)ZF零标志
1747057808999.webp
1747057827002.webp

(3)SF符号标志
1747057877487.webp
1747057899713.webp

(4)OF溢出标志
1747057931478.webp
1747057961047.webp