我正在阅读另一个关于两行代码效率的问题,OP说他看了代码背后的程序集,两行在程序集中是相同的.除了离题之外,我如何查看编译程序时创建的汇编代码.
我正在使用Microsoft的Visual C++,但我也想知道是否可以查看用Visual Basic编写的代码后面的程序集.
那么,如何查看用C++和Visual Basic等高级语言编写的程序背后的汇编代码?
这可能是徒劳的,因为我知道编写一个操作系统是无法忍受的复杂(尤其是自己).
我不希望构建下一个linux或Windows.
我知道这将是可怕的,而且越野车,并且不会起作用,但那很好.
我想在Assembly,C和(某些)C++中自己编写所有内容.
这是一个未来的项目,因为我现在忙于其他一些事情并且没有立即的时间,但我想我现在会问它,所以也许我可以得到很多答案,它可以构建并成为这种方法的有用资源(我所见过的其他一切都涉及构建minix,使用现有的引导程序,在虚拟引导程序中构建它等).
我想用显示器,键盘和鼠标设置一个旧的桌面,然后开始使用空白硬盘.
我想学习如何编写我自己的bootloader(我已经找到了很多有关这方面的资源,但为了完整性,请仍然添加一些好的),我自己的USB驱动程序(如果有必要),CD驱动程序(如果有必要的话) )等等,从头开始.
如何将代码放入计算机?用软盘做它最好吗?大多数计算机可以通过USB记忆棒完成吗?
我需要哪些司机,你能建议任何建议吗?
启动序列之后 - 然后是什么?我如何进入保护模式等
如何在没有操作系统帮助的情况下管理内存?我只是使用我想要的任何地址吗?无需初始化?
毫无疑问,我会遇到什么会让我困惑?
我怎样才能使命令行O/S和图形命令行?
什么是图形操作系统?比如,我怎么做一些命令行,一个字体,一个顶部的图片?
我在哪里可以阅读有关设置多任务环境的信息?(即,有两个并行运行的图形命令行).
我该如何设置一种窗口系统?设置简单的多任务处理后,如何在屏幕上显示图形?
相信我,我知道这是一个非常复杂的项目,我可能永远无法完成它或在任何用途上写任何东西.
还有很多其他的部分我还没有提到过,如果你想到的话,也可以自由添加.
请为每个答案添加一个"主题" - 例如,USB驱动程序,然后可能是资源列表,需要注意的事项等.
此外,请不要建议建立另一个操作系统或预先存在的代码.我知道我将阅读许多预先存在的代码(例如Linux内核,或示例资源,现有驱动程序等),但最终我想自己完成所有的写作.我知道我应该建立其他的东西,而且还有很多其他的问题,如果我改变主意并走那条路,我就可以读到这些问题.但这一切都是关于从头开始做整件事.
关于如何获得图形的任何建议?不同的视频模式以及如何使用它们等?
以下所有说明都做同样的事情:设置%eax为零.哪种方式最佳(需要最少的机器周期)?
xorl %eax, %eax
mov $0, %eax
andl $0, %eax
Run Code Online (Sandbox Code Playgroud) 我一直在英特尔Core Duo上分析我们的一些核心数学,并且在研究平方根的各种方法时,我注意到一些奇怪的事情:使用SSE标量操作,采用倒数平方根并乘以它更快获取sqrt,而不是使用本机sqrt操作码!
我正在测试它的循环类似于:
inline float TestSqrtFunction( float in );
void TestFunc()
{
#define ARRAYSIZE 4096
#define NUMITERS 16386
float flIn[ ARRAYSIZE ]; // filled with random numbers ( 0 .. 2^22 )
float flOut [ ARRAYSIZE ]; // filled with 0 to force fetch into L1 cache
cyclecounter.Start();
for ( int i = 0 ; i < NUMITERS ; ++i )
for ( int j = 0 ; j < ARRAYSIZE ; ++j )
{
flOut[j] = TestSqrtFunction( flIn[j] ); …Run Code Online (Sandbox Code Playgroud) 我正在准备C中的一些培训材料,我希望我的示例适合典型的堆栈模型.
C堆栈在Linux,Windows,Mac OSX(PPC和x86),Solaris和最新的Unix中的发展方向是什么?
最近我一直在阅读一些SO档案,并遇到了针对x86架构的声明.
为什么我们需要不同的CPU架构用于服务器和迷你/大型机和混合核心?他说:
" PC架构一团糟,任何操作系统开发人员都会告诉你. "
学习汇编语言值得努力吗?(存档)说
"意识到x86架构充其量是可怕的 "
学习x86汇编程序的任何简单方法?他说:
" 大多数大学都教MIPS之类的装配,因为它更容易理解,x86装配非常难看 "
还有更多的评论
我试过搜索,但没有找到任何理由.我发现x86不好可能因为这是我熟悉的唯一架构.
有人可以给我一些考虑x86丑陋/坏/劣等的理由.
我决定学习汇编语言.这样做的主要原因是能够理解反汇编的代码,并且可能能够编写更有效的代码部分(例如,通过c ++),做一些代码洞穴等等.我看到有大量不同的程序集所以,就我提到的目的而言,我该如何开始?我应该学习什么样的装配?我想通过首先做一些简单的程序(即计算器)来学习,但目标本身将是与它一起被认可,所以我可以理解所显示的代码,例如IDA Pro.
我正在使用Windows(如果这有任何区别).
编辑:所以,似乎每个人都指向MASM.虽然我明白它具有高级功能,但对于汇编代码程序员来说都很有用,这不是我想要的.它似乎有流行的反汇编程序(如IDA)中没有显示的if,invoke等指令.所以,如果可能的话,我想听到的是任何使用ASM的人的意见(我在IDA中阅读反汇编的exe代码),而不仅仅是"通用"汇编程序员.
编辑:好的.我已经在学习集会了.我正在学习MASM,而不是使用对我来说无关紧要的高级东西.我现在正在做的是在c ++中使用__asm指令尝试我的代码,所以我可以比使用MASM从头开始做所有事情更快地尝试.
我试图更深入地了解编程语言的低级操作是如何工作的,尤其是它们如何与OS/CPU交互.我可能已经在Stack Overflow上的每个堆栈/堆相关线程中阅读了每个答案,并且它们都很棒.但还有一件事我还没有完全理解.
在伪代码中考虑这个函数,这往往是有效的Rust代码;-)
fn foo() {
let a = 1;
let b = 2;
let c = 3;
let d = 4;
// line X
doSomething(a, b);
doAnotherThing(c, d);
}
Run Code Online (Sandbox Code Playgroud)
这就是我假设堆栈在X行上的样子:
Stack
a +-------------+
| 1 |
b +-------------+
| 2 |
c +-------------+
| 3 |
d +-------------+
| 4 |
+-------------+
Run Code Online (Sandbox Code Playgroud)
现在,我读到的关于堆栈如何工作的一切都是它严格遵守LIFO规则(后进先出).就像.NET,Java或任何其他编程语言中的堆栈数据类型一样.
但如果是这样,那么在X行之后会发生什么?显然,接下来我们需要的是使用a和b,但这意味着操作系统/ CPU(?)必须弹出d并c首先回到a和b.但是它会在脚下射击,因为它需要c并且d在下一行.
所以,我想知道幕后究竟发生了什么?
另一个相关问题.考虑我们传递对其他函数的引用,如下所示:
fn foo() {
let …Run Code Online (Sandbox Code Playgroud) 在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汇编的怪癖).
assembly ×10
x86 ×5
callstack ×2
performance ×2
x86-64 ×2
abi ×1
c ×1
cpu ×1
dword ×1
low-level ×1
mips ×1
optimization ×1
osdev ×1
pointers ×1
sse ×1
stack ×1
stack-frame ×1
visual-c++ ×1