SHL指令
SHL指令使目的操作数逻辑左移一位,最低位用0填充。最高位移入进位标志位,而进位标志位中原来的数值被丢弃。
若将1100 1111左移1位,该数就变为 1001 1110
例如:
BL左移一位。最高位复制到进位标志位,最低位填充0:
mov bl, 8FH ; BL = 10001111b
shi bl, 1 ; CF = 1, BL = 00011110b
当一个数多次进行左移时,进位标志位保存的是最后移出最高有效位(MSB)的数值。
mov al, 10000000b
shi al, 2 ; CF = 0, AL = 00000000b
步骤:
1.将一个寄存器或者内存单元中过的数据向左移动bit位。
2.将溢出的这一位放到CF中。
3.最低位用0补充。
位元乘法
数值进行左移即行了位元乘法。
任何操作数左移 n 位,将该数乘以 2n。
例如,十进制数 10 左移两位,其结果与10 * 2n相同。
mov al, 10 ; 00001010
shl dl ,2 ; 00101000
SHR指令
SHR指令使目的操作数逻辑右移一位,最高位用0填充。最低位置复制到进位标志位,而进位标位中原来的数值被丢弃。
例如:
AL中的最低位0被复制到进位标志位,而AL中的最高位用0填充。
mov al, 0D0H ; aL = 11010000b
shr al, 1 ; aL = 01101000b, CF = 0
在多位移操作中,最后一个移出位0的数值进入进位标志位。
mov al, 00000010b
shr al, 2 ; AL = 00000000b, CF = 1
总结:
当一个数多次进行右移时,进位标志位保存的是最后移出最低有效位的数值。
关键字:汇编
引用地址:
汇编 SHL指令和SHR指令
推荐阅读最新更新时间:2024-11-12 11:00
GNU ARM汇编--(十五)linux下的printascii
在前面对很多s3c2440的功能模块进行学习后,已经具备了将这些模块综合起来的条件,基于此,将前面的代码综合成一个简单的bootloader.自己写的bootloader在引导kernel的时候,串口输出只有Uncompressing Linux...和done, booting the kernel。串口有这个输出,说明kernel被正确引导了,但是串口有问题。 这篇blog只是分析解决这个问题的第一步: 既然 Uncompressing Linux... 这句打印是kernel代码中的,那kernel的其他打印怎么没有? 在archarmootcompressed目录下的misc.c中,上面的
[单片机]
第14章 有条件跳转(X86汇编教程)
本X86汇编教程目录 h ttp://www.51hei.com/mcu/2619.html 一阵疯狂的游戏后,我又回来了....还记得无条件跳转吗?这回我将讲解有条件跳转. 什么是有条件跳转呢?那就是,必须达成某某条件才能跳转,比如说必须数字1和数字2一样才跳转,或者数字1比数字2大才跳转,如果条件没有实现则不跳转,相当于跳转指令不存在.也许你想到了高级语言的IF语句,没错,IF语句也是用有条件跳转实现的. 判断的过程是分两步进行的.先把2个数值运算一下,得出哪个数大哪个小或者是否等于.然后才是有条件跳转指令 前边说过,当我们使用计算指令的时候标志寄存器会随着计算结果改变,所以,从标志寄存
[单片机]
把累加器ACC中的内容通过串行发送出去汇编语言源程序
把累加器ACC中的内容通过串行发送出去,汇编语言程序如下: SOUT:MOV SCON,#40H ;设置串行接口为工作方式 MOV TMOD,#20H ;定时器T1工作于模式2 MOV TL1,#0E8H; ;设置波特率为1200b/s MOV TH1,#0E8H SETB TR1 MOV SBUF,A JNB T1,$ CLB T1 RET
[单片机]
gcc代码反汇编查看内存分布[1]: gcc
# gcc -v gcc version 4.4.5 (Ubuntu/Linaro 4.4.4-14ubuntu5) 重点: 代码中的内存分配, 地址从低到高: 代码段(RO, 保存函数代码) -- 只读数据段(RO, 保存常量) -- 数据段(RW, 已初始化并且初始值不为0的全局变量和静态变量) -- bss段(RW, 未初始化或者初始化为0的全局变量和静态变量). 程序运行起来之后, 堆区和栈区的变量地址是动态分配的. #include stdio.h #include stdlib.h int global_ni; // .bss int global_iz = 0 ; // .bss in
[单片机]
ARM 汇编程序设计
A.5.1 文件格式 ARM 源程序文件(即源文件)为文件格式,可以使用任一文本编辑器编写程序代码。 在一个项目中,至少要有一个汇编源文件或C 程序文件,可以有多个汇编源文件或多个C 程序文件,或者C 程序文件和汇编文件两者的组合。 A.5.2 ARM 汇编的一些规范 (1)汇编语句格式 ARM 汇编中,所有标号必须在一行的顶格书写,其后面不要添加“:”,而所有指令均不能顶格书写。ARM 汇编器对标识符大小写敏感,书写标号及指令时字母大小写要一致,在ARM 汇编程序中,一个ARM 指令、伪指令、寄存器名可以全部为大写字母,也可以全部为小写字母,但不要大小写混合使用。注释使用“;”,注释内容由“;”
[单片机]
汇编冒泡排序(51)(需调试器付初值)
;此程序属于冒泡排序算法,不能用查找表(只能在调试时用内存表中设置处置进行仿真实验)(因为查找表是数据是存放在rom中的,所以说是无法去修改的,无能为力,因此只能通过调试来实现) Num EQU 31H ;定义临时次数变量(也可理解为总数据变量) ORG 0000H LCALL START ;跳转到排序算法 SJMP $ ;如果排序完成,在此循环 START:MOV R0,#50H;把地址0050h付给R0中 MOV Num,#4 ;所有数据个数放在Num中
[单片机]
Cortex-M3的第一个内嵌汇编函数(MDK环境)
#include memmap.h #include gpio.h #include Defination.c u8 i='a'; __asm u8 plus(u8 a) //注意是两个 _ { MOV R1,R0 //由于R0传递第一个参数,故将a的值赋给R1寄存器 ADD R1,#6 //将R1的值加6 MOV R0,R1 //返回值写入R0 BX LR //返回主程序 } int main(void) { *RCC_APB2ENR=0x00000018;//打开portb和portc的时钟 setPORT(&POR
[单片机]
ARM汇编语言入门(六)
Part 6:条件状态和分支 在探讨CPSR时我们已经接触了条件状态。我们通过跳转(分支)或者一些只有满足特定条件才执行的指令来控制程序在运行时的执行流。通过CPSR寄存器中的特定bit位来表示条件状态。这些位根据指令每次执行的结果而不断变化。例如,比较运算时如果两个数相等,那么就置CPSR中的Zero位(Z=1),实际上是因为:a - b = 0,这种情况下就是相等状态。如果第一个数大,那么就是大于状态。如果第二个数大,就是小于状态。除此之外,还有小于等于、大于等于等等。 下面的表格列出了可用的条件状态码,描述和标志位: 在下面代码片段中看一下执行条件加法时的实际用法L: .global main main:
[单片机]