我一直在尝试在业余时间学习C语言,其他语言(C#,Java等)具有相同的概念(通常是相同的运算符)......
我想知道是,在核心层,是什么位移(<<,>>,>>>)这样做,可以帮助它什么问题解决,和周围的弯曲什么潜伏的陷阱?换句话说,一个绝对的初学者指导比特移位的所有优点.
我想知道这些说明之间的区别是:
MOV AX, [TABLE-ADDR]
Run Code Online (Sandbox Code Playgroud)
和
LEA AX, [TABLE-ADDR]
Run Code Online (Sandbox Code Playgroud) 请考虑以下代码(p属于类型unsigned char*且bitmap->width属于某种整数类型,具体哪个是未知的,取决于我们正在使用的某个外部库的版本):
for (unsigned x = 0; x < static_cast<unsigned>(bitmap->width); ++x)
{
*p++ = 0xAA;
*p++ = 0xBB;
*p++ = 0xCC;
}
Run Code Online (Sandbox Code Playgroud)
值得优化它[...]
可能存在这样一种情况,即通过编写可以产生更有效的结果:
unsigned width(static_cast<unsigned>(bitmap->width));
for (unsigned x = 0; x < width; ++x)
{
*p++ = 0xAA;
*p++ = 0xBB;
*p++ = 0xCC;
}
Run Code Online (Sandbox Code Playgroud)
...或者编译器优化是否微不足道?
您认为什么是"更好"的代码?
编辑(Ike)的注意事项:对于那些对三角形文本感到疑惑的人来说,原来的问题,如同措辞一样,非常接近于偏离主题的领域,并且尽管有积极的反馈,但非常接近于被关闭.这些已经被打乱了.但是,请不要惩罚那些解决这些问题的受影响部分的回答者.
在x86-64 Tour of Intel Manuals中,我读到了
也许最令人惊讶的事实是,诸如
MOV EAX, EBX自动将指令的高32位归零的指令RAX.
同一来源引用的英特尔文档(3.4.1.1 64位手动基本架构中的通用寄存器)告诉我们:
- 64位操作数在目标通用寄存器中生成64位结果.
- 32位操作数生成32位结果,在目标通用寄存器中零扩展为64位结果.
- 8位和16位操作数生成8位或16位结果.目标通用寄存器的高56位或48位(分别)不会被操作修改.如果8位或16位操作的结果用于64位地址计算,则将寄存器显式符号扩展为完整的64位.
在x86-32和x86-64汇编中,16位指令如
mov ax, bx
Run Code Online (Sandbox Code Playgroud)
不要表现出这种"奇怪"的行为,即eax的上层词被归零.
因此:引入这种行为的原因是什么?乍一看似乎不合逻辑(但原因可能是我习惯了x86-32汇编的怪癖).
当我手写组装时,我通常会选择表格
lea eax, [eax+4]
Run Code Online (Sandbox Code Playgroud)
在表格上..
add eax, 4
Run Code Online (Sandbox Code Playgroud)
我听说lea是一个"0时钟"指令(如NOP),而'add'则不是.但是,当我看到编译器生成的程序集时,我经常看到后一种形式而不是第一种.我足够聪明地相信编译器,所以任何人都可以了解哪一个更好?哪一个更快?为什么编译器选择后一种形式呢?
动态整数将是0到150之间的任何数字.
即 - 数字返回41,需要返回50.如果数字是10则需要返回10.数字是1需要返回10.
如果我将整数修改为小数,我以为我可以使用天花板功能......?然后使用天花板功能,并回到十进制?
唯一的事情也是必须知道这个数字是1,2或3位数(即-7 vs 94 vs 136)
有没有更好的方法来实现这一目标?
谢谢,
关于这个LEAL指令,0x10的功能是什么?它是一个乘法或加法还是别的?
leal 0x10(%ebx), %eax
Run Code Online (Sandbox Code Playgroud)
有人可以澄清一下吗?这是Linux机器上的x86汇编程序.
我很好奇有多少种方法可以在x86汇编中将寄存器设置为零.使用一条指令.有人告诉我,他设法找到了至少10种方法.
我能想到的是:
xor ax,ax
mov ax, 0
and ax, 0
Run Code Online (Sandbox Code Playgroud) 我正在使用C#(这个问题也适用于像C++这样的类似语言),我试图找出最快,最有效的增量方法.在我的游戏中,它不仅仅是一个或两个增量,而是每秒300个增量.就像屏幕上每个精灵的帧都在递增,我的RPG角色的速度和位置,相机的偏移等等.所以我在想,最有效的方法是什么?例如,y_pos我可以做的每次运动增加5 :
1.
Player.YPos += 5;
Run Code Online (Sandbox Code Playgroud)
2.
Player.YPos = Player.YPos + 5;
Run Code Online (Sandbox Code Playgroud)
3.
for (int i = 0; i < 5; i++)
{
Player.YPos++;
}
Run Code Online (Sandbox Code Playgroud)
哪个是最有效的(也是最快的)?
我对它们之间的区别有点困惑
leal -4(%ebp), %eax
Run Code Online (Sandbox Code Playgroud)
和
movl -4(%ebp), %eax
Run Code Online (Sandbox Code Playgroud)
谁可以给我解释一下这个?