第3章-5逻辑移位
- 格式:ppt
- 大小:665.00 KB
- 文档页数:22
寻址方式指令系统
数据传送指令算术运算指令逻辑运算指令串操作指令
控制转移指令处理器控制指令
通用传送指令
累加器专用传送指令
地址传送指令
标志传送指令
对标志位的影响: 除SAHF和POPF指令外,其余的所有数据传送类指令
格式:
功能:
操作数类型:
DS,100H
用
堆栈:执行
PUSH
POP
SS指向堆栈段的起始位置SP指定栈顶
PUSH AX PUSH DS POP DS POP AX
格式:
oprd1,
立即数、段寄存器和
不影响
通用传送指令
累加器专用传送指令地址传送指令
标志传送指令
LEA (Load Effective Address)
LDS (Load pointer into register and DS) LES (Load pointer into register and ES)
LEA LEA
LEA
数据传送指令算术运算指令逻辑运算指令串操作指令
控制转移指令处理器控制指令
实现二进制
所有算术运算指令均所有算术运算指令均
四则运算是计算机经常进行的一种操作。
请注意算术运算指令对
只有一个操作数:寄存器或存储单元对操作数加
用于计数器和地址指针的调整
不影响进位
对操作数减
用于计数器和地址指针的调整不影响进位。
逻辑位移是C语言中的一种位运算符,用于将一个整数的二进制表示向左或向右移动指定的位数。
逻辑位移操作符有两种:左移(<<)和右移(>>)。
1. 左移(<<):将一个整数的二进制表示向左移动指定的位数,右边用0填充。
例如,将数字5(二进制表示为101)左移2位,得到的结果为20(二进制表示为10100)。
```c
#include <stdio.h>
int main() {
int num = 5;
int result = num << 2;
printf("左移结果:%d
", result);
return 0;
}
```
2. 右移(>>):将一个整数的二进制表示向右移动指定的位数,左边用符号位填充。
例如,将数字-5(二进制表示为11111111111111111111111111111011)右移3位,得到的结果为-16(二进制表示为11111111111111110000000000000000)。
```c
#include <stdio.h>
int main() {
int num = -5;
int result = num >> 3;
printf("右移结果:%d
", result);
return 0;
}
```。
实验三
实验目的(要求):巩固练习逻辑移位指令,及串操作指令
实验原理:
实验仪器:DEBUG、微型计算机
实验要求:所有实验内容均需抓图说明。
实验内容:
1.练习逻辑及移位指令
2.练习串操作相关指令,掌握指令及重复前缀的使用规则
3.完成课后习题3-13(编写出程序片段)
(附加阅读)写出完整汇编源程序,对字符串进行操作时,确定它的长度。
要求以或$作为字符串结束标志。
(提示)-----计算串长的子程序-----
STRLEN PROC
LEA DI,STRING
MOV CX,0FFFFH ;(CX)=-1
MOV AL,CR ;(AL)=0DH
MOV AH,’$’;(AH)=24H
CLD ;DF=0
AGAIN: INC CX ;串长加1,初始值(CX)=0 CMP CX,100H
JAE DONE ;串长>255,则结束
CMP [DI],AH ;本字符是’$’?
JE DONE ;是,则结束
SCASB;本字符是CR?
JNE AGAIN ;未找到,返回继续
DONE: MOV LENGTH1,CX ;找到,LENGTH1←串长RET ;返回主程序
STRLEN ENDP。
三、逻辑运算和移位指令逻辑运算和移位指令逻辑运算指令AND DST,SRC 逻辑与指令OR DST,SRC 逻辑或指令XOR DST,SRC 逻辑异或指令TEST DST,SRC 测试指令NOT OPR 逻辑非指令移位指令SHL OPR,CNT 逻辑左移指令SAL OPR,CNT 算术左移指令SHR OPR,CNT 逻辑右移指令SAR OPR,CNT 算术右移指令ROL OPR,CNT 左循环移位指令ROR OPR,CNT 右循环移位指令RCL OPR,CNT 带进位左循环移位指令RCR OPR,CNT 带进位右循环移位指令SHLD DST,REG,CNTSHRD DST,REG,CNT逻辑运算指令(1)AND 逻辑与指令格式:AND DST ,SRC功能:(DST)←(DST)∧(SRC)(按位与)操作数:通用寄存器立即数存储器AND MEM , IDATAAND REG , IDATAAND REG , MEMAND MEM , REGAND REG , REG对标志寄存器的影响:1)CF=OF=0;2)根据运算结果设置SF、ZF、PF标志;3)AF无定义。
说明:1)利用AND指令,可以保留特定位(与1),同时屏蔽掉其它位(与0),以检测特定位。
2)利用AND指令,可以将某些特定位设置为0(与0),同时使其余位保持原值不变化(与1)。
3)一个寄存器和自身进行逻辑与运算,该寄存器内容不变。
但该运算影响了SF、ZF、PF三个标志位,并使OF和CF清零。
利用该特性,可以判断一个数据的正负、是否为零、以及数据的奇偶性。
格式:OR DST ,SRC功能:(DST)←(DST)∨(SRC)(按位或)操作数:通用寄存器立即数存储器OR MEM , IDATAOR REG , IDATAOR REG , MEMOR MEM , REGOR REG , REG对标志寄存器的影响:1)CF=OF=0;2)根据运算结果设置SF、ZF、PF标志;3)AF无定义。
微机原理第3章习题(答案)1. 下列各条指令是否有错?如果有,请指出错误之处并改正(1)MOV DS,1000H(2)MOV [100],23H(3)ADD AX,[BX+BP+6](4)PUSH DL(5)IN AX,[3FH](6)OUT 3FFH,AL(7)LES SS,[SI](8)POP [AX](9)IMUL 4CH(10)SHL BX,5(11)INT 300(12)XCHG DX,0FFFH答:(1)错误。
不允许直接向段寄存器送立即数,可改为:MOV AX,1000HMOVDS,AX(2)错误。
该指令在语法上是对的,即可以把一个立即数送入一个存储单元;但是如果考虑实际编译,则第一操作数前应加上BYTE PTR 或WORD PTR 说明,否则汇编程序会因不能确定操作数长度而指示出错。
可改为:MOV BYTE PTR [100],23H(3)错误。
不能同时使用两个基址寄存器BX、BP 进行间接寻址,可改为:ADD AX,[BX+DI+6] (4)错误。
堆栈操作应以字为单位进行,而DL 是一个字节。
可改为:PUSH DX(5)错误。
在输入/输出指令中,8 位端口地址应直接写在操作数处。
可改为:IN AX,3FH(6)错误。
端口地址3FFH 已超出8 位二进制表示范围,16 位端口地址应用DX。
可改为:MOV DX,3FFH OUT DX,AL(7)错误。
LES 指令的目操作数应该是通用寄存器,不能是段寄存器。
可改为:LES BX,[SI](8)错误。
AX 不能用于间接寻址,间接寻址只能用BX、BP、SI、DI 四个寄存器之一。
可改为:POP [BX](9)错误。
立即数不能做乘法指令的操作数,可改为:MOV BL,4CH IMUL BL(10)错误。
当逻辑移位的次数大于1时,应该用CL指示次数。
可改为MOV CL,5 SHL BX,CL (11)错误。
操作数300 > 255,已超出有效的中断类型码范围。
逻辑移位名词解释
嘿,你知道啥是逻辑移位不?这可真是个超级有趣的概念啊!比如说,就像搭积木一样,本来积木好好地在那堆着,突然你把其中一块
挪到了别的地方,整个结构就不一样了啦!逻辑移位差不多就是这样
的感觉呀!
想象一下,你正在解一道数学题,按照常规的思路一步一步来,突
然你发现,咦,如果我把这个条件换个位置,或者把这个步骤提前,
哇塞,一下子就有新的解法出现了呢!这就是逻辑移位在起作用呀!
再打个比方,好比你在走一条路,一直沿着原来的方向走,突然你
脑子一转,诶,我为啥不换个方向走走看呢,说不定有新的风景呢!
这也是一种逻辑移位嘛!
我记得有一次和朋友们玩游戏,我们都按照老一套的方法玩,结果
老是玩不过去。
这时候我就提议,要不咱们试试把规则稍微变一变,
把一些步骤调换一下顺序。
嘿,你猜怎么着,一下子就变得超级好玩,而且还顺利过关了呢!这就是逻辑移位带来的神奇效果呀!
逻辑移位可不只是在游戏里有用哦,在生活中也是处处可见呢!比
如说工作中遇到难题了,别死脑筋地一直用原来的方法呀,试着换个
角度思考,把一些因素的位置换换,说不定就能找到新的解决办法呢!
在学习中也是一样呀,老是用一种学习方法可能效果不好,那为啥
不试试换一种呢?就像把知识的排列顺序变一变,说不定就能更好地
理解和掌握啦!
总之呢,逻辑移位就是让我们打破常规,大胆尝试新的组合和顺序,去发现更多的可能性!它能让我们的思维更加灵活,让我们的生活更
加丰富多彩!所以呀,别老是一成不变啦,时不时地来个逻辑移位,
给自己的生活加点料吧!。
第 3 章习题答案2(4)高级语言中的运算和机器语言 (即指令) 中的运算是什么关系?假定某一个高级语P中有乘、言源程序除运算,但机器M中不提供乘、除运算指令,则程序P 能否在机器M上运行?为什么?参考答案:(略)3.考虑以下 C 语言程序代码:int func1(unsigned word){return (int) (( word <<24) >> 24);}int func2(unsigned word){return ( (int) word <<24 ) >> 24;}假设在一个32 位机器上执行这些函数,该机器使用二进制补码表示带符号整数。
无符号数采用逻辑移位,带符号整数采用算术移位。
请填写下表,并说明函数func1 和func2 的功能。
函数func1 的功能是把无符号数高24 位清零(左移24 位再逻辑右移24位),结果一定是正的有符号数;而函数func2 的功能是把无符号数的高24 位都变成和第25 位一样,因为左移24 位后进行算术右移,高24 位补符号位(即第25 位)。
4.填写下表,注意对比无符号数和带符号整数的乘法结果,以及截断操作前、后的结果。
5.以下是两段 C 语言代码,函数arith( ) 是直接用 C 语言写的,而optarith( ) 是对arith( ) 函数以某个确定的M和N编译生成的机器代码反编译生成的。
根据optarith( ) ,可以推断函数arith( ) 中M和N的值各是多少?#define M#define Nint arith (int x, int y){int result = 0 ;result = x*M + y/N;return result;}int optarith ( int x, int y){i nt t = x;x << = 4;x - = t;i f ( y < 0 ) y += 3;y>>2;r eturn x+y;参考答案:可以看出x*M 和“ int t = x; x << = 4; x-=t; ”三句对应,这些语句实现了x 乘15 的功能(左移 4 位相当于乘以16,然后再减 1 ),因此,M等于15;y/N 与“if ( y < 0 ) y += 3; y>>2; ”两句对应,功能主要由第二句“ y右移2位”实现,它实现了y除以4的功能,因此N是4。