首页 > 其他分享 >位运算

位运算

时间:2022-11-03 11:13:51浏览次数:61  
标签:右移 10000001 运算 左移 al CF printf

 

 

汇编中的移位指令

1、算术移位指令

 

 

  • SAL(Shift Arithmetic Left):算术左移

  • SAR(Shift Arithmetic Right):算术右移

  • 格式:SAL/SAR Reg/Mem, CL/Imm

即算数移位指令后面的第一个操作数是寄存器或者内存;

第二个操作数是寄存器或者立即数

SAL eax,2
SAL ax,1
SAL al,3


举例:
SAR al,1         //al:10000001右移一位最高位补原来符号位,最低位移入CF,即11000000 / CF:1
SAL al,2         //al:10000001左移两位最高位移入CF,最低位补0,即00000100 /  CF:0

2.逻辑移位指令

 

  • SHL(Shift Left):逻辑左移

  • SHR(Shift Right):逻辑右移

  • 格式:SHL/SHR Reg/Mem, CL/Imm

    SHL eax,2
    SHR word ptr es:[ebp],1
    SHL al,1

    举例:
    SHR al,1         //al:10000001右移一位最高位补0,最低位移入CF,即01000000 /  CF:1
    SHL al,1         //al:01000001左移一位最高位移入CF,最低位补0,即10000010 /  CF:0

     

3.循环移位指令

 

  • ROL(Rotate Left):循环左移

  • ROR(Rotate Right):循环右移

  • 格式:ROL/ROR r/m, i8/CL

    ROL eax,3
    ROL cx,1
    ROR cl,2

    举例
    ROL al,1   //al:10000001循环左移一位最高位补到最低位,最高位移入CF,即00000011 /  CF:1
    ROR al,1   //al:10000001循环右移一位最低位补到最高位,最低位移入CF,即11000000 /  CF:1

4.带进位的循环移位指令

 

  • RCL(Rotate through Carry Left):带进位循环左移

  • RCR(Rotate through Carry Right):带进位循环右移

  • 格式:RCL/RCR r/m, i8/CL

RCL eax,1
RCR cx,2
RCR al,1

举例:
RCL al,1 //al:10000001,CF:0循环左移一位最高位移入CF,CF原来的数补到最低位,即al:00000010 / CF:1
RCR al,1 //al:10000001,CF:0循环右移一位最低位移入CF,CF原来的数补到最高位,即al:01000000 / CF:1

C语言中的移位运算

与运算 &

printf("%d",2&3); //2

或运算 |

printf("%d",2|3); //3

非运算 ~

printf("%d",~2); //-3,因为%d打印的是有符号的整数

异或运算 ^

printf("%d",2^3); //1

移位运算 << >>

左移运算,有符号和无符号是无区别的

int a = 8;
printf("%d",a<<1);  //16
unsigned int b = 8;
printf("%d",b<<1);  //16

查看反汇编:生成的汇编指令都是shl,逻辑左移

img

右移运算,有符号对应SAR即算数右移,无符号对应SHR即逻辑右移

int a = 0xF0000000;
printf("%d",a>>1);  //-134217728
unsigned int b = 0xF0000000;
printf("%d",b>>1);  //2013265920

查看反汇编:有符号右移生成的指令为SAR,无符号右移生成的指令为SHR

img

作业

 

#include "stdafx.h"
​
​
    void Function_1_1()     
    {
            unsigned char x=0xf5,y=0xff;
            int i;
            scanf("%d",&i);
        /*  if((x=x&(y<<i))==0)
                (printf("第%d位是0",i+1));
            else
                (printf("第%d位是1",i+1));
*/
    printf("第%d位是%x",i,x=x&(y>>(8-i))); 
        //  printf("%x",x);
            
    }       
​
​
​
int main()
{           
​
        Function_1_1();             
​
    return 0;
​
}
 

 

  • 用十六进制文本编辑器分别打开一个.exe、.dll、.sys、.txt、.doc、.jpg、.pdf等将前两个字节写在下面

.exe:内存中显式为4D 5A,我们读作0x5A4D .dll:同样是4D 5A .sys:4D 5A开头,但也有25 75 .txt:0A 66,读作0x660A .doc:D0 CF,读作0xCFD0 .jpg:FF D8 .pdf:25 50,读作0x5025

  • 将一个在十六进制编辑器中打开的.exe文件,拖拽到最后,观察文件中的大小和硬盘上的大小

可以发现用十六进制编辑器打开一个.exe文件,它的最大地址0x0829CDF0,换算成10进制,就刚好等于这个文件的大小136957440字节 img

标签:右移,10000001,运算,左移,al,CF,printf
From: https://www.cnblogs.com/QZLZZBM/p/16853770.html

相关文章

  • 学习Java的第三天 运算符
    运算符算术运算符注意事项需要注意的是i++和++i的区别i++运行完这行代码后在进行自增或自减++i在运行这行前就进行自增或者自减运算结果的数据类型为参与运算的......
  • 6.运算符
    在python中定义如下语句:a=1+2,在该语句中涉及到+(算数运算符)和=(赋值运算符),运算符是书写程序中不可获取的1.算术运算符2.比较运算符  3.赋值运算符  4.成员......
  • 运算符
    运算符有:算术运算符关系运算符逻辑运算符位运算符赋值运算符其他运算符......
  • shell语法4-printf命令、test命令和判断符号[]、逻辑运算符&&和||
    一、printf命令printf命令用于格式化输出,类似于C/C++中的printf函数。默认不会在字符串末尾添加换行符!!!例如:printf"%10d.\n"123 #占10位,右对齐printf"%-10.2f.\n"......
  • 字符串的运算
     ##算数运算符###+求和#a=2#d=3#c=a+d#print(c)##-#print(d-a)###*乘法#print(a*d)###/除法#print(d/a)###%取余#print(d%a)###*......
  • 1034 有理数四则运算
    本题要求编写程序,计算2个有理数的和、差、积、商。输入格式:输入在一行中按照 a1/b1a2/b2 的格式给出两个分数形式的有理数,其中分子和分母全是整型范围内的整数,负号......
  • Java运算符
    1.算数运算符a.加法减法乘法除法求余自增减运算符自增自减关系运算符不等于等于大于大于等于小于小于等于逻辑运算符逻辑与逻辑或逻辑非位运算符......
  • 计算机运算方法————除法
    原码除法符号位单独计算操作数的绝对值的原码以及绝对值的补码参与运算运算的次数位参与运算的被除数的尾数的个数n次(1)恢复余数法(2)不恢复余数法(加减交替......
  • 四则运算中对负数的处理
    解决方法:在负数前面进行补0,如-a-100->(0-a)-100,之后用逆波兰表达的方法计算即可。java测试代码:publicstaticvoidmain(String[]args)throwsException{......
  • JavaScript 可选链运算符
    可选链运算符(?.)允许读取位于连接对象链深处的属性的值,而不必明确验证链中的每个引用是否有效。?.运算符的功能类似于.链式运算符不同之处在于,在引用为空(nullish)(n......