标签: assembly

如何使用Visual C++查看代码背后的程序集?

我正在阅读另一个关于两行代码效率的问题,OP说他看了代码背后的程序集,两行在程序集中是相同的.除了离题之外,我如何查看编译程序时创建的汇编代码.

我正在使用Microsoft的Visual C++,但我也想知道是否可以查看用Visual Basic编写的代码后面的程序集.

那么,如何查看用C++和Visual Basic等高级语言编写的程序背后的汇编代码?

assembly visual-c++

111
推荐指数
7
解决办法
10万
查看次数

`dword ptr'是什么意思?

有人能解释这意味着什么吗?(英特尔语法,x86,Windows)

and     dword ptr [ebp-4], 0
Run Code Online (Sandbox Code Playgroud)

x86 assembly pointers dword

111
推荐指数
3
解决办法
13万
查看次数

如何在旧台式计算机上构建小型操作系统?

这可能是徒劳的,因为我知道编写一个操作系统是无法忍受的复杂(尤其是自己).

  • 我不希望构建下一个linux或Windows.

  • 我知道这将是可怕的,而且越野车,并且不会起作用,但那很好.

我想在Assembly,C和(某些)C++中自己编写所有内容.

这是一个未来的项目,因为我现在忙于其他一些事情并且没有立即的时间,但我想我现在会问它,所以也许我可以得到很多答案,它可以构建并成为这种方法的有用资源(我所见过的其他一切都涉及构建minix,使用现有的引导程序,在虚拟引导程序中构建它等).

我想用显示器,键盘和鼠标设置一个旧的桌面,然后开始使用空白硬盘.

我想学习如何编写我自己的bootloader(我已经找到了很多有关这方面的资源,但为了完整性,请仍然添加一些好的),我自己的USB驱动程序(如果有必要),CD驱动程序(如果有必要的话) )等等,从头开始.

  • 如何将代码放入计算机?用软盘做它最好吗?大多数计算机可以通过USB记忆棒完成吗?

  • 我需要哪些司机,你能建议任何建议吗?

  • 启动序列之后 - 然后是什么?我如何进入保护模式等

  • 如何在没有操作系统帮助的情况下管理内存?我只是使用我想要的任何地址吗?无需初始化?

  • 毫无疑问,我会遇到什么会让我困惑?

  • 我怎样才能使命令行O/S和图形命令行?

  • 什么是图形操作系统?比如,我怎么做一些命令行,一个字体,一个顶部的图片?

  • 我在哪里可以阅读有关设置多任务环境的信息?(即,有两个并行运行的图形命令行).

  • 我该如何设置一种窗口系统?设置简单的多任务处理后,如何在屏幕上显示图形?

相信我,我知道这是一个非常复杂的项目,我可能永远无法完成它或在任何用途上写任何东西.

还有很多其他的部分我还没有提到过,如果你想到的话,也可以自由添加.

请为每个答案添加一个"主题" - 例如,USB驱动程序,然后可能是资源列表,需要注意的事项等.

此外,请不要建议建立另一个操作系统或预先存在的代码.我知道我将阅读许多预先存在的代码(例如Linux内核,或示例资源,现有驱动程序等),但最终我想自己完成所有的写作.我知道我应该建立其他的东西,而且还有很多其他的问题,如果我改变主意并走那条路,我就可以读到这些问题.但这一切都是关于从头开始做整件事.

关于如何获得图形的任何建议?不同的视频模式以及如何使用它们等?

c assembly bootstrapping operating-system osdev

110
推荐指数
13
解决办法
5万
查看次数

在x86汇编中将寄存器设置为零的最佳方法是什么:xor,mov或?

以下所有说明都做同样的事情:设置%eax为零.哪种方式最佳(需要最少的机器周期)?

xorl   %eax, %eax
mov    $0, %eax
andl   $0, %eax
Run Code Online (Sandbox Code Playgroud)

optimization performance x86 assembly micro-optimization

109
推荐指数
1
解决办法
4万
查看次数

为什么SSE标量sqrt(x)比rsqrt(x)*x慢?

我一直在英特尔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)

floating-point performance x86 assembly sse

106
推荐指数
4
解决办法
4万
查看次数

在大多数现代系统中,堆栈增长的方向是什么?

我正在准备C中的一些培训材料,我希望我的示例适合典型的堆栈模型.

C堆栈在Linux,Windows,Mac OSX(PPC和x86),Solaris和最新的Unix中的发展方向是什么?

assembly stack callstack abi stack-frame

101
推荐指数
6
解决办法
4万
查看次数

为什么x86难看?为什么与其他人相比,它被认为是劣等的?

最近我一直在阅读一些SO档案,并遇到了针对x86架构的声明.

还有更多的评论

我试过搜索,但没有找到任何理由.我发现x86不好可能因为这是我熟悉的唯一架构.

有人可以给我一些考虑x86丑陋/坏/劣等的理由.

x86 assembly x86-64 mips cpu-architecture

101
推荐指数
6
解决办法
3万
查看次数

学习大会

我决定学习汇编语言.这样做的主要原因是能够理解反汇编的代码,并且可能能够编写更有效的代码部分(例如,通过c ++),做一些代码洞穴等等.我看到有大量不同的程序集所以,就我提到的目的而言,我该如何开始?我应该学习什么样的装配?我想通过首先做一些简单的程序(即计算器)来学习,但目标本身将是与它一起被认可,所以我可以理解所显示的代码,例如IDA Pro.

我正在使用Windows(如果这有任何区别).

编辑:所以,似乎每个人都指向MASM.虽然我明白它具有高级功能,但对于汇编代码程序员来说都很有用,这不是我想要的.它似乎有流行的反汇编程序(如IDA)中没有显示的if,invoke等指令.所以,如果可能的话,我想听到的是任何使用ASM的人的意见(我在IDA中阅读反汇编的exe代码),而不仅仅是"通用"汇编程序员.

编辑:好的.我已经在学习集会了.我正在学习MASM,而不是使用对我来说无关紧要的高级东西.我现在正在做的是在c ++中使用__asm指令尝试我的代码,所以我可以比使用MASM从头开始做所有事情更快地尝试.

assembly

99
推荐指数
7
解决办法
4万
查看次数

callstack究竟是如何工作的?

我试图更深入地了解编程语言的低级操作是如何工作的,尤其是它们如何与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行之后会发生什么?显然,接下来我们需要的是使用ab,但这意味着操作系统/ CPU(?)必须弹出dc首先回到ab.但是它会在脚下射击,因为它需要c并且d在下一行.

所以,我想知道幕后究竟发生了什么?

另一个相关问题.考虑我们传递对其他函数的引用,如下所示:

fn foo() {
    let …
Run Code Online (Sandbox Code Playgroud)

cpu assembly callstack calling-convention low-level

99
推荐指数
5
解决办法
2万
查看次数

为什么32位寄存器上的x86-64指令归零整个64位寄存器的上半部分?

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汇编的怪癖).

x86 assembly x86-64 cpu-registers zero-extension

97
推荐指数
3
解决办法
2万
查看次数