Tag: 汇编

解释AF标志在x86指令中的工作原理?

我有一个小的8086模拟器,我有一个长期的错误2年,现在AF在sub内部表现不正常并添加说明。 我目前计算其值的方法是8位数和减法: uint8_t base=… , subt=… base=base&0xF; subt=subt&0xF; //isolate bottom nibble if((int16_t)base-subt>7 || (int16_t)base-subt<-7){ flags.af=1; }else{ flags.af=0; } (假设像sub base,subt这样的指令) 并添加它是这样的: uint8_t base=… , adder=… base=base&0xF; adder=adder&0xF; //isolate bottom nibble if(base+adder>7 || base+adder<-7){ flags.af=1; }else{ flags.af=0; } (对于像add base,adder这样的指令) 如何正确计算模拟器中的AF标志以获取此类指令?

gcc的primefaces操作和代码生成

我正在考虑通过gcc查看为primefaces操作生成的一些程序集。 我尝试了以下短序列: int x1; int x2; int foo; void test() { __atomic_store_n( &x1, 1, __ATOMIC_SEQ_CST ); if( __atomic_load_n( &x2 ,__ATOMIC_SEQ_CST )) return; foo = 4; } 看看Herb Sutter关于代码生成的primefaces武器谈话,他提到X86手册要求将xchg用于primefaces存储,并使用简单的mov来进行primefaces读取。 所以我期待的是: test(): .LFB0: .cfi_startproc pushq %rbp .cfi_def_cfa_offset 16 .cfi_offset 6, -16 movq %rsp, %rbp .cfi_def_cfa_register 6 movl $1, %eax xchg %eax, x1(%rip) movl x2(%rip), %eax testl %eax, […]

矢量化模运算

我正在尝试编写一些合理快速的组件向量加法代码。 我正在使用(签名,我相信)64位整数。 function是 void addRq (int64_t* a, const int64_t* b, const int32_t dim, const int64_t q) { for(int i = 0; i < dim; i++) { a[i] = (a[i]+b[i])%q; // LINE1 } } 我正在使用icc -std=gnu99 -O3 (icc以便我以后可以使用SVML)在IvyBridge(SSE4.2和AVX,但不是AVX2)上进行编译。 我的基线是从LINE1中删除%q 。 使用dim=11221184 100(迭代)函数调用需要1.6秒。 ICC自动矢量化SSE代码; 大。 我真的想做模块化的补充。 使用%q ,ICC不会自动向量化代码,并且它在11.8秒(!)内运行。 即使忽略了之前尝试的自动矢量化,这似乎仍然过分。 由于我没有AVX2,因此使用SSE进行矢量化需要SVML,这也许就是ICC没有自动矢量化的原因。 无论如何,这是我尝试对内循环进行矢量化: __m128i qs = _mm_set1_epi64x(q); for(int i […]

汇编,机器代码,字节码和操作码之间的实际关系是什么?

汇编,机器代码,字节码和操作码之间的实际关系是什么? 我已经阅读了大部分有关汇编和机器代码的SO问题,例如,但它们的级别太高,并没有显示实际汇编代码转换为机器代码的示例。 结果,我仍然不明白它是如何在更深层次上运作的。 这个问题的理想答案将显示一些汇编代码的具体示例,例如下面的代码段,以及每个汇编指令如何映射到机器代码,字节码和/或操作码。 这样的答案对未来的人们学习集会非常有帮助,因为在过去几天的挖掘过程中,我还没有找到任何明确的总结。 我要找的主要内容是: 一段汇编代码 一段机器代码 程序集和机器代码片段之间的映射 (如何进行映射,或者至少是一些一般示例,以及如何知道如何执行此操作,Web上的所有这些信息都在哪里) 如何解释机器代码 (就像操作码以某种方式相关,以及网上关于所有这些数字意味着什么的所有信息) 注意:我没有计算机科学背景,所以我在过去几年里一直在慢慢走低水平,现在已经到了想要了解assembly和机器代码的程度。 assembly与机器代码之间的关系 我目前的理解是“汇编程序”(如NASM)接收汇编代码并从中创建机器代码。 所以当你编译一些像这个example.asm这样的程序集时: global main section .text main: call write write: mov rax, 0x2000004 mov rdi, 1 mov rsi, message mov rdx, length syscall section .data message: db ‘Hello, world!’, 0xa length: equ $ – message (用nasm -f macho64 -o example.o example.asm编译它)。 […]

如何告诉GCC为实模式生成16位代码

我正在编写实模式函数,它应该是具有堆栈帧的正常函数,但是它应该使用%sp而不是%esp。 有办法吗?

AMD64 – nopw汇编指令?

在这个编译器输出中,我试图理解nopw指令的机器码编码是如何工作的: 00000000004004d0 : 4004d0: eb fe jmp 4004d0 4004d2: 66 66 66 66 66 2e 0f nopw %cs:0x0(%rax,%rax,1) 4004d9: 1f 84 00 00 00 00 00 在http://john.freml.in/amd64-nopl上有一些关于“nopw”的讨论。 任何人都可以解释4004d2-4004e0的含义吗? 从查看操作码列表看, 66 ..代码似乎是多字节扩展。 我觉得我可能会得到一个比这更好的答案,除非我试图让操作码列表停留几个小时。 asm输出来自C中的以下(疯狂)代码,它优化为简单的无限循环: long i = 0; main() { recurse(); } recurse() { i++; recurse(); } 当使用gcc -O2编译时,编译器会识别无限递归并将其转换为无限循环; 它实际上做得很好,事实上,它实际上在main()循环而不调用recurse()函数。 编者注:带NOP的填充函数并不特定于无限循环。 在Godbolt编译器资源管理器中 ,这是一组具有一系列NOP长度的函数。

如何在没有C本机编译器的情况下创建C编译器

这是一个简单的问题。 如果编译C编译器需要一个C编译器……也许直接用汇编代码? 也许内核提供了将C转换为汇编程序并创建升级基础结构的基本工具? 这也是一个愚蠢的问题,但我真的很感兴趣如何设计一个操作系统(不是我)从0开始与CPU和内存交互。

从程序集调用C / C ++函数(OSX Mavericks x64)

这是一个奇怪的问题,我似乎无法找到答案。 这个: #include using namespace std; void show_number(int number) { cout << number << endl; // Shows '10' as expected } int main() { cout << endl; // Remove this and it fails __asm { mov rdi, 10 call show_number } } 实际上工作正常,除非你删除初始cout << endl ( main第一行)。 当你删除它时, show_number的cout似乎由于某种原因导致段错误。 是什么导致这个? (OSX Mavericks x64,但我认为应该在linux中工作)

调用方法/函数时汇编语言会发生什么?

如果我有一个C ++ / C程序(语言无关紧要,只需说明一个概念): #include void foo() { printf(“in foo”); } int main() { foo(); return 0; } assembly中会发生什么? 我实际上并不是在寻找汇编代码,因为我还没有那么远,但基本原理是什么?

根据CERT编码规则POS49-C访问共享结构中的相邻成员时的竞争条件?

根据CERT编码规则POS49-C ,访问相同结构的不同字段的不同线程可能会发生冲突。 我使用常规的unsigned int而不是bit-field。 struct multi_threaded_flags { unsigned int flag1; unsigned int flag2; }; struct multi_threaded_flags flags; void thread1(void) { flags.flag1 = 1; } void thread2(void) { flags.flag2 = 2; } 我可以看到,即使是unsigned int,仍然存在竞争条件IF编译器决定使用加载/存储8个字节而不是4个字节。 我认为编译器永远不会这样做,并且竞争条件永远不会发生在这里,但这完全是我的猜测。 是否有关于此案例的明确定义的汇编/编译器文档? 我希望锁定,这是昂贵的,是这种情况恰好未定义的最后手段。 仅供参考,我使用gcc。