[汇编语言笔记篇]四:通用数据处理指令

往期:

 

[汇编语言笔记篇]0:(我的第一个汇编程序)

[汇编语言笔记篇]二:数据的表示

[汇编语言笔记篇]三:数据寻址

 

目录

通用数据处理指令

数据传送指令

​地址传送指令

地址传送程序

堆栈操作指令

堆栈操作程序:

算数运算类指令

状态标志

加法指令

减法指令

增量指令INC

减量指令DEC

位操作指令

逻辑与指令AND

逻辑或指令OR

逻辑非指令NOT

 逻辑异或指令XOR

逻辑运算程序

逻辑运算的屏蔽作用

 移位指令

循环移位指令


通用数据处理指令


数据传送指令

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

 

  • 1
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

beglage

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值