- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
<分区>
我试过这段代码:
#include <stdlib.h>
#include <stdio.h>
__attribute__((always_inline)) void dummy_fct(int *a){
float b[2] = {(float)a[0] / 42,(float)a[1] / 66};
a[0] = (int)b[0];
a[1] = (int)b[1];
}
int main(void){
int v[2] = {rand(),rand()};
dummy_fct(v);
printf("%d %d\n",v[0],v[1]);
return 0;
}
当我用 gcc 编译它并且没有任何选项时,我得到这个警告(这是合乎逻辑的):
main.c:4:37: warning: always_inline function might not be inlinable [-Wattributes]
__attribute__((always_inline)) void dummy_fct(int *a){
但是当我读取生成的二进制程序集时(使用 objdump -d my_binary
)我得到了这个:
(...)
0000000000400550 <frame_dummy>:
400550: 55 push %rbp
400551: 48 89 e5 mov %rsp,%rbp
400554: 5d pop %rbp
400555: e9 36 ff ff ff jmpq 400490 <register_tm_clones>
40055a: 90 nop
40055b: 90 nop
000000000040055c <dummy_fct>:
40055c: 55 push %rbp
40055d: 48 89 e5 mov %rsp,%rbp
400560: 48 89 7d e8 mov %rdi,-0x18(%rbp)
400564: 48 8b 45 e8 mov -0x18(%rbp),%rax
400568: 8b 00 mov (%rax),%eax
40056a: f3 0f 2a c0 cvtsi2ss %eax,%xmm0
40056e: f3 0f 10 0d ea 01 00 movss 0x1ea(%rip),%xmm1 # 400760 <_IO_stdin_used+0xc>
400575: 00
400576: f3 0f 5e c1 divss %xmm1,%xmm0
40057a: f3 0f 11 45 f8 movss %xmm0,-0x8(%rbp)
40057f: 48 8b 45 e8 mov -0x18(%rbp),%rax
400583: 48 83 c0 04 add $0x4,%rax
400587: 8b 00 mov (%rax),%eax
400589: f3 0f 2a c0 cvtsi2ss %eax,%xmm0
40058d: f3 0f 10 0d cf 01 00 movss 0x1cf(%rip),%xmm1 # 400764 <_IO_stdin_used+0x10>
400594: 00
400595: f3 0f 5e c1 divss %xmm1,%xmm0
400599: f3 0f 11 45 fc movss %xmm0,-0x4(%rbp)
40059e: f3 0f 10 45 f8 movss -0x8(%rbp),%xmm0
4005a3: f3 0f 2c d0 cvttss2si %xmm0,%edx
4005a7: 48 8b 45 e8 mov -0x18(%rbp),%rax
4005ab: 89 10 mov %edx,(%rax)
4005ad: f3 0f 10 45 fc movss -0x4(%rbp),%xmm0
4005b2: 48 8b 45 e8 mov -0x18(%rbp),%rax
4005b6: 48 8d 50 04 lea 0x4(%rax),%rdx
4005ba: f3 0f 2c c0 cvttss2si %xmm0,%eax
4005be: 89 02 mov %eax,(%rdx)
4005c0: 90 nop
4005c1: 5d pop %rbp
4005c2: c3 retq
00000000004005c3 <main>:
4005c3: 55 push %rbp
4005c4: 48 89 e5 mov %rsp,%rbp
4005c7: 48 83 ec 20 sub $0x20,%rsp
4005cb: e8 28 fe ff ff callq 4003f8 <rand@plt>
4005d0: 89 45 f0 mov %eax,-0x10(%rbp)
4005d3: e8 20 fe ff ff callq 4003f8 <rand@plt>
4005d8: 89 45 f4 mov %eax,-0xc(%rbp)
4005db: 48 8d 45 f0 lea -0x10(%rbp),%rax
4005df: 48 89 45 f8 mov %rax,-0x8(%rbp)
4005e3: 48 8b 45 f8 mov -0x8(%rbp),%rax
4005e7: 8b 00 mov (%rax),%eax
4005e9: f3 0f 2a c0 cvtsi2ss %eax,%xmm0
4005ed: f3 0f 10 0d 6b 01 00 movss 0x16b(%rip),%xmm1 # 400760 <_IO_stdin_used+0xc>
4005f4: 00
4005f5: f3 0f 5e c1 divss %xmm1,%xmm0
4005f9: f3 0f 11 45 e8 movss %xmm0,-0x18(%rbp)
4005fe: 48 8b 45 f8 mov -0x8(%rbp),%rax
400602: 48 83 c0 04 add $0x4,%rax
400606: 8b 00 mov (%rax),%eax
400608: f3 0f 2a c0 cvtsi2ss %eax,%xmm0
40060c: f3 0f 10 0d 50 01 00 movss 0x150(%rip),%xmm1 # 400764 <_IO_stdin_used+0x10>
400613: 00
400614: f3 0f 5e c1 divss %xmm1,%xmm0
400618: f3 0f 11 45 ec movss %xmm0,-0x14(%rbp)
40061d: f3 0f 10 45 e8 movss -0x18(%rbp),%xmm0
400622: f3 0f 2c d0 cvttss2si %xmm0,%edx
400626: 48 8b 45 f8 mov -0x8(%rbp),%rax
40062a: 89 10 mov %edx,(%rax)
40062c: f3 0f 10 45 ec movss -0x14(%rbp),%xmm0
400631: 48 8b 45 f8 mov -0x8(%rbp),%rax
400635: 48 8d 50 04 lea 0x4(%rax),%rdx
400639: f3 0f 2c c0 cvttss2si %xmm0,%eax
40063d: 89 02 mov %eax,(%rdx)
40063f: 8b 55 f4 mov -0xc(%rbp),%edx
400642: 8b 45 f0 mov -0x10(%rbp),%eax
400645: 89 c6 mov %eax,%esi
400647: bf 58 07 40 00 mov $0x400758,%edi
40064c: b8 00 00 00 00 mov $0x0,%eax
400651: e8 82 fd ff ff callq 4003d8 <printf@plt>
400656: b8 00 00 00 00 mov $0x0,%eax
40065b: c9 leaveq
40065c: c3 retq
40065d: 90 nop
40065e: 90 nop
40065f: 90 nop
(...)
当然,没有callq
到dummy_fct
,但我很惊讶地看到函数的代码不在main中,而是存在于在单独的部分中的二进制文件。
我的意思是内联已经添加了一些代码,因此二进制文件应该更大(如果内联代码被多次使用)。那么为什么函数的二进制文件仍然存在于 main 之外!?所以二进制文件更大...关于在 gcc 中内联,我真的不明白这一点。
(这个比较哲学问题,这里不多说)
我试图在图形模式下打印一个字符。通常当我打印我正在做的一个字符时: mov ah,14 ; ah=14 mov al,'x' int 10h ; print the character 这
我试图通过更改其中的一个字节来修改存储在内存中的字符串。我为此使用了 movb,但由于某种原因,给定内存位置的字节没有改变。 在 gdb 调试器上: 14 movb %al, (%r10) # nex
我一直在阅读一些汇编代码,并且开始发现调用指令实际上是与程序计数器相关的。 但是,每当我使用 Visual Studio 或 Windbg 进行调试时,它总是显示 call 0xFFFFFF ...这
我最近一直在使用 Visual C++ 中的内联汇编,我想知道是否可以直接向堆栈上的局部变量添加值,例如: push 5 add [esp], 7 这样做可以吗?我问这个问题是因为我在执行此操作时随机
我有下一个代码: mov al, -5 add al, 132 add al, 1 据我检查,溢出标志和进位标志将在第一个操作中设置,而在第二个操作中,仅设置溢出。 但我不明白为什么: 在无符号数中,
在 64 位 x86 汇编 nasm 中,如何将单个字节从寄存器移动到 .data 节中定义的内存位置? 我知道这有效 global _main section .data quotient db 0
我的汇编代码有问题。我想打印存储在寄存器 cx 中的数字,但是当我尝试打印它时,它打印的是 ascii 字符而不是 ascii 数字,所以我决定编写一个程序将 ascii char 转换为 ascii
为什么第 1B 行的跳转指令(例如)变成了 EBBD? 我知道“jmp”= EB但是BD是怎么计算的呢? 最佳答案 短跳转使用一个带符号的偏移量添加到 JMP 之后的指令地址。 例如,第一个 JMP
以下两者有什么区别: mov eax, [eax+4] 和 add eax, 4 mov eax, [eax] 如果不是,那么汇编器是否会选择哪个来进行某种优化? 最佳答案 这
看《The Shellcoder's Handbook》中的一些汇编和反汇编代码,发现一条指令的序列操作数是不一样的。 例如,在 assembly 上: mov ebx,0 并且,在反汇编时: mov
我有这个非常简单的汇编代码: start: add ax, 100 ; if ax overflow add to bx 1 jmp start 但我不知道如何检测 ax 寄存器溢出,有人可以帮
在 64 位 x86 汇编 nasm 中,如何将单个字节从寄存器移动到 .data 节中定义的内存位置? 我知道这有效 global _main section .data quotient db 0
我的汇编代码有问题。我想打印存储在寄存器 cx 中的数字,但是当我尝试打印它时,它打印的是 ascii 字符而不是 ascii 数字,所以我决定编写一个程序将 ascii char 转换为 ascii
我正在学习一些关于操作系统开发的教程,我发现了一篇关于多重引导 header 。这些是您必须定义的一些“神奇”值才能使用GRUB2。这些是命令: # Declare constants used f
为什么第 1B 行的跳转指令(例如)变成了 EBBD? 我知道“jmp”= EB但是BD是怎么计算的呢? 最佳答案 短跳转使用一个带符号的偏移量添加到 JMP 之后的指令地址。 例如,第一个 JMP
我正在尝试从内存中复制一些单词并使用汇编将其保存到另一个内存地址。我正在尝试为其编写代码,但我不确定其中的某些部分。我将简要描述我想要做什么。 源地址、目标地址和要复制的字数是函数的输入参数。 最佳答
当我们想要像这样创建一个初始化变量时: name db 'zara ali' 我们创建了一个字节大小变量,但我们在其中存储了一个字符串 这怎么可能?? 当我们使用这条指令时: MOV ecx, nam
我还是汇编的新手,我还不知道汇编中的许多命令代码。我想在 16 位寄存器中进行除法。我想打印它的内容。我知道我需要将寄存器的内容转换为 ASCII 进行打印,但同样,我的问题是除法。请帮我。 比如cx
使用有什么区别: c.eq.s $1, $2 bc1t L2 并使用: beq $1, $2, L2 如果他们做同样的事情,为什么有两种分支方式?如果它们不同,那么它们各自的好处是什么
源代码: int main() { int i; for(i=0, i : push rbp 2. 0x000055555555463b :
我是一名优秀的程序员,十分优秀!