从C语言到汇编(二)位运算

本文探讨了从C语言到汇编的位运算,包括与(&)、或(|)、异或(^)、取反(~)、算术移位(<<, >>)和逻辑移位(<<, >>)。通过示例汇编代码,详细解释了各种位运算的实现和效果。" 78165428,5576739,iOS App间通信:URL Scheme深度解析与实践,"['iOS开发', 'App交互', 'URL处理']
摘要由CSDN通过智能技术生成

从C语言到汇编(二)算术运算

存储程序式计算机以二进制来表示数据和指令。所以,我们可以对二进制位进行一些操作。
这些操作包括了与(&),或(|),异或(^),取反(~),算术左移(<<),逻辑左移(<<),算术右移(>>),逻辑右移(>>)。

与运算 0 1
0 0 0
1 0 1

可以用与操作来屏蔽某些位。

#include <stdio.h>
int main(void)
{
   
	int a=100;
	int b=0xfffffff0;
	int c=a&b;   //相当于a减去a%16的值
	printf("value=%d\n",c);
	
	c=a&0xfffffff0;
	printf("value=%d\n",c);
	
	return 0;
}

汇编代码

.section .rodata
	.LC0:.string "value=%d\n"
.text
.global main

main:
	pushl %ebp
	movl %esp,%ebp
	
	subl $12,%esp
	movl $100,-4(%ebp);a
	movl $0xfffffff0,-8(%ebp);b
	movl -4(%ebp),%eax
	andl -8(%ebp),%eax
	movl %eax,-12(%ebp);c
	
	pushl -12(%ebp)
	pushl $.LC0
	call printf
	addl $8,%esp
	
	movl -4(%ebp),%eax
	andl $0xfffffff0,%eax
	movl %eax,-12(%ebp)
	
	pushl -12(%ebp)
	pushl $.LC0
	call printf
	addl $8,%esp
	
	movl $0,%eax
	leave
	ret

movl $100,-4(%ebp) 将a赋值为100,movl $0xfffffff0,-8(%ebp) 将b赋值为0xfffffff0,movl -4(%ebp),%eax 赋值a为%eax,andl -8(%ebp),%eax b与%eax(a)的值相与,并将结果放入%eax中,movl %eax,-12(%ebp) 将与的结果放入c中。
andl $0xfffffff0,%eax 将0xfffffff0与%eax相与,并将结果放入%eax中。
用到的指令有

指令 效果 描述
AND S,D D<-D&S

或运算 0 1
0 0 1
1 1 1

可以用于设置某些位。

#include <stdio.h>
int main(void)
{
   
	int a=0xfffffff0;
	int b=0xe;
	int c=a|b;   //相当于a减去a%16的值
	printf("value=%d\n",c);
	
	c=a|0xe;
	
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值