小编Mys*_*ial的帖子

为什么gcc会生成详细的汇编代码?

我对GCC生成的汇编代码有疑问(-S选项).因为,我是汇编语言的新手并且对它知之甚少,这个问题将是非常原始的.不过,我希望有人会回答:

假设,我有这个C代码:

main(){

    int x = 15; 

    int y = 6;

    int z = x - y;


    return 0;
}
Run Code Online (Sandbox Code Playgroud)

如果我们查看汇编代码(特别是对应于int z = x - y的部分),我们会看到:

主要:

...
subl    $16, %esp
movl    $15, -4(%ebp)
movl    $6, -8(%ebp)
movl    -8(%ebp), %eax
movl    -4(%ebp), %edx
movl    %edx, %ecx
subl    %eax, %ecx
movl    %ecx, %eax
movl    %eax, -12(%ebp)
...
Run Code Online (Sandbox Code Playgroud)

为什么GCC不能生成类似这样的东西,这样可以减少复制内容.

主要:

...
movl    $15, -4(%ebp)
movl    $6, -8(%ebp)
movl    -8(%ebp), %edx          
movl    -4(%ebp), %eax          
subl    %edx, %eax              
movl    %eax, -12(%ebp)
...
Run Code Online (Sandbox Code Playgroud)

PS

Linux …

linux assembly gcc

3
推荐指数
1
解决办法
2188
查看次数

布尔值和== vs =

语言是Java.鉴于这种:

public static void main(String[] args) {
    Boolean b1 = true;
    Boolean b2 = true;
    int i1 = 1;

    if (b1 = true) //line 5
    if (b1 == true}  // line 6
Run Code Online (Sandbox Code Playgroud)

我理解这b1 == true是一个等效测试,它会给出结果:true或false.然而,b1 = true对于我的理解是一个声明,除了在这种情况下,它应该只返回:b1 = true返回true,与==test 完全相同?

你能解释一下原因吗?谢谢!

java boolean

3
推荐指数
1
解决办法
751
查看次数

"| ="运算符的含义?

我遇到过类似的代码

if (flagsDef) 
flagsTainted |= flagsUsed;
Run Code Online (Sandbox Code Playgroud)

请协助了解所用操作员的含义.

c

3
推荐指数
1
解决办法
126
查看次数

SSE比较内在化 - 如何从比较中获得1或0?

我试图用SSE内在函数编写if语句的等价物.

__m128 _mm_cmplt_ps(__m128 a, __m128 b)用来做比较a <b,这会返回0xffffffff或者0x0如果比较分别为true或false.我想将这些值转换为1和0.为了做到这一点,实现逻辑"和"是正确的,转换的结果__m128 _mm_and_ps(__m128 c , __m128 d)在哪里,例如,?cd0xffffffff

感谢您的关注.

c comparison if-statement sse intrinsics

3
推荐指数
1
解决办法
2497
查看次数

使用单个AVX内在函数反转包含双精度的AVX寄存器

如果我有一个AVX寄存器,其中有4个双打,并且我想将其反向存储在另一个寄存器中,是否可以使用单个内部命令执行此操作?

例如:如果我在SSE寄存器中有4个浮点数,我可以使用:

_mm_shuffle_ps(A,A,_MM_SHUFFLE(0,1,2,3));
Run Code Online (Sandbox Code Playgroud)

我可以使用_mm256_permute2f128_pd()吗?我不认为你可以用上面的内在来解决每个人的双重问题.

c sse simd vectorization avx

3
推荐指数
1
解决办法
2534
查看次数

Char*共享相同的内存

这是我的代码,我需要澄清此代码的输出:

#include <stdio.h>
int main(void )
{
char name1[10] = "Rajan" , name2[10] = "Rajan" ;
char *name3 = "Chennai" , *name4 = "Chennai" ;
printf("\nAddress for name1 and name2 : %p and %p",name1,name2) ;
printf("\nAddress for name3 and name4 : %p and %p",name3,name4) ;
return 0 ;
}
Run Code Online (Sandbox Code Playgroud)

这段代码的输出是

Address for name1 and name2 : 0x7fff9e6cbe10 and 0x7fff9e6cbe20
Address for name3 and name4 : 0x400760 and 0x400760
Run Code Online (Sandbox Code Playgroud)

这里的值的地址name1name2是不同的,因为我分配了两个不同的阵列.但在的情况下name3name4,地址是相同的,为什么不一样?它不会创建不同的内存并为值分配名称Chennai?为什么它指向相同的内存?

c gcc

3
推荐指数
1
解决办法
138
查看次数

我什么时候可以在汇编语言中使用*?

有这些数据

.data
tableD DWORD 10h, 20h, 30h, 40h, 50h, 60h
Rowsize = ($ - tableD)
DWORD 60h,70h,80h,90h,0A0h
DWORD 0B0h,0C0h,0D0h,0E0h,0F0h
Run Code Online (Sandbox Code Playgroud)

我可以用

.code
mov eax,tableD[ebx + esi*TYPE tableD]
Run Code Online (Sandbox Code Playgroud)

但我不能用

mov eax,tableD[ebx*2 + esi*TYPE tableD]
Run Code Online (Sandbox Code Playgroud)

但我可以用

mov eax,tableD[ebx*2 + esi]
Run Code Online (Sandbox Code Playgroud)

我不能在那里使用2*s?

我可以知道这些物品的条款吗?

x86 assembly

3
推荐指数
1
解决办法
83
查看次数

我可以在算术表达式中调用构造函数吗?

我正在实现一个Matrix类,我重载了*+运算符.我也有一个构造函数:

Matrix (int row, int col, const elemType &init_val) 
Run Code Online (Sandbox Code Playgroud)

构造一个初始化的矩阵,在所有位置保存init_val.所以基于这个实现,我有我的测试程序:

 Matrix<int> mi4 = Matrix<int> (2, 2, 3) + Matrix<int> (2, 2, 1);
Run Code Online (Sandbox Code Playgroud)

编译器给我以下错误:

testMatrix.cpp:41: error: ambiguous overload for ‘operator+’ in ‘Matrix<int>(2, 2, ((const int&)((const int*)(&3)))) + Matrix<int>(2, 2, ((const int&)((const int*)(&1))))’
Matrix.h:91: note: candidates are: Matrix<elemType> operator+(const Matrix<elemType>&, const Matrix<elemType>&) [with elemType = int]
Run Code Online (Sandbox Code Playgroud)

我记得在C++标准库中,你可以在表达式中调用构造函数.我该如何实现呢?非常感谢!

c++

2
推荐指数
1
解决办法
234
查看次数

在基本的Tic-Tac-Toe游戏中保存数据

我对C相对较新.在Kochan的"C语言编程"中,我目前正在使用if-else语句.我正在尝试编写一个基本的tic-tac-toe游戏,但我遇到了一些困难.一旦玩家放置了x或o,我不确定如何保存棋盘.这是我到目前为止的代码:

#include <stdio.h>

int main (void)
{
    int board = "_|_|_\n
                 _|_|_\n
                  | | \n";
    int player1, player2;

    printf ("Print %i", board)

    printf("Player 1, it's your move:")
    scanf("%i", player1)

    if(player1 == "upLeft")
        printf("x|_|_\n
                _|_|_\n
                _|_|_\n
etc.
Run Code Online (Sandbox Code Playgroud)

我还是太初学者才能实现这个功能吗?

c

2
推荐指数
1
解决办法
924
查看次数

如何告诉openmp不要同步数组

我有一个具有以下结构的代码.

#pragma omp parallel for
for( i = 0; i < N; i++ )
{
    .....
    index = get_index(...);
    array[index] = ...;
    .....
}
Run Code Online (Sandbox Code Playgroud)

现在index每个线程的值都是唯一的(它永远不会为不同的线程重叠),但是当然OpenMP无法猜测这个,我想是使用同步对象来访问array.

我怎么能要求openmp不要使用同步对象,array并依赖我,这个index值对于不同的线程是唯一的.我试图放入array私人列表,但是因此出现了分段错误.

c linux gcc x86-64 openmp

2
推荐指数
1
解决办法
602
查看次数

标签 统计

c ×6

gcc ×3

assembly ×2

linux ×2

sse ×2

avx ×1

boolean ×1

c++ ×1

comparison ×1

if-statement ×1

intrinsics ×1

java ×1

openmp ×1

simd ×1

vectorization ×1

x86 ×1

x86-64 ×1