Tag: x86

如何清除__m256值的高128位?

如何清除m2的高128位: __m256i m2 = _mm256_set1_epi32(2); __m128i m1 = _mm_set1_epi32(1); m2 = _mm256_castsi128_si256(_mm256_castsi256_si128(m2)); m2 = _mm256_castsi128_si256(m1); 不起作用 – 英特尔的_mm256_castsi128_si256内在文档说“结果向量的高位未定义”。 同时我可以在assembly中轻松完成: VMOVDQA xmm2, xmm2 //zeros upper ymm2 VMOVDQA xmm2, xmm1 当然我不想使用“和”或_mm256_insertf128_si256()等。

在C中获取帧指针

我试图在我的C程序中获得FP,我尝试了两种不同的方式,但它们都与我运行GDB时的方式不同。 我尝试的第一种方法,我在C中为Assembly函数创建了一个协议函数: int* getEbp(); 我的代码看起来像这样: int* ebp = getEbp(); printf(“ebp: %08x\n”, ebp); // value i get here is 0xbfe2db58 while( esp <= ebp ) esp -= 4; printf( "ebp: %08x, esp" ); //value i get here is 0xbfe2daec 我的汇编代码 getEbp: movl %ebp, %eax ret 我尝试使原型函数只返回一个int,但这也与我的GDB输出不匹配。 我们正在使用x86程序集。 编辑:拼写错误,我的getEsp函数看起来与另一个完全相同: getEsp: movl %esp, %eax ret

双线百分号(%%)在gcc内联汇编中有什么作用?

我遇到了一个看起来像这样的代码: asm volatile ( # […] “movl $1200, %%ecx;” # […] ); 我知道什么是movl $1200, %ecx在x86中做了什么。 但我很困惑为什么有两个百分号。

如何在C语言中检测包装计数器和大负值之间的差异

为我的愚蠢道歉,因为这是我在这个论坛上的第一篇文章。 我试图通过以下代码检测包装无符号32位计数器和大负跳转之间的区别,但编译器给出了错误: 错误:由于数据类型的范围有限,比较始终为真[-Werror = type-limits] 这是我的代码片段: #define MAX_BACKWARD_JUMP -4294959295 //UINT_MAX – 8000 #define MIN_BACKWARD_JUMP -3600 #define MAX_FORWARD_JUMP 4800000 signed int rtpDelta; //Signed 32-bit unsigned int currRTPTs, prevRTPTs; //unsigned 32-bit rtpDelta = currRTPTs – prevRTPTs; if ((rtpDelta > MAX_BACKWARD_JUMP && rtpDelta MAX_FORWARD_JUMP)) { printf(“Delta in Timestamps too large\n”,rtpDelta); } 这里的想法是在RTP时间戳中捕获无效的大型Deltas。 我们有一个当前的TimeStamp和一个从对等RTP客户端接收的前一个Timestamp。 RTP时间戳的无效值的边界限制是-4294959295 <rtpDelta <-3600,如果Delta小于-3600且大于-4294959295则应该抛出错误,因为更接近UMAX_INT的值将被视为翻转。 我在这做错了什么?

使用外部c代码编译asm引导加载程序

我在asm中编写了一个引导加载程序,并希望在我的项目中添加一些已编译的C代码。 我在这里创建了一个测试函数: test.c的 __asm__(“.code16\n”); void print_str() { __asm__ __volatile__(“mov $’A’ , %al\n”); __asm__ __volatile__(“mov $0x0e, %ah\n”); __asm__ __volatile__(“int $0x10\n”); } 这是asm代码(引导加载程序): hw.asm [org 0x7C00] [BITS 16] [extern print_str] ;nasm tip start: mov ax, 0 mov ds, ax mov es, ax mov ss, ax mov sp, 0x7C00 mov si, name call print_string mov al, ‘ ‘ […]

x86内核中的键盘IRQ

我正在尝试编写一个非常简单的内核用于学习目的。 在阅读了大量有关x86架构中PIC和IRQ的文章后,我发现IRQ1是键盘处理程序。 我正在使用以下代码打印正在按下的键: #include “port_io.h” #define IDT_SIZE 256 #define PIC_1_CTRL 0x20 #define PIC_2_CTRL 0xA0 #define PIC_1_DATA 0x21 #define PIC_2_DATA 0xA1 void keyboard_handler(); void load_idt(void*); struct idt_entry { unsigned short int offset_lowerbits; unsigned short int selector; unsigned char zero; unsigned char flags; unsigned short int offset_higherbits; }; struct idt_pointer { unsigned short limit; unsigned int base; […]

无法识别的仿真模式:MinGW32上的elf_i386

我正在尝试创建一个内核,我无法将C输出与程序集链接起来。 ld 。 我收到了错误: 无法识别的仿真模式:elf_i386 我正在使用Windows 10专业版与MinGW32和MSYS。 我正在使用的代码: link.ld /* * link.ld */ OUTPUT_FORMAT(elf32-i386) ENTRY(start) SECTIONS { . = 0x100000; .text : { *(.text) } .data : { *(.data) } .bss : { *(.bss) } } kernel.c /* * kernel.c */ void kmain(void) { const char *str = “my first kernel”; char *vidptr = (char*)0xb8000; […]

浪费内存分配局部变量

这是我的计划: void test_function(int a, int b, int c, int d){ int flag; char buffer[10]; flag = 31337; buffer[0] = ‘A’; } int main() { test_function(1, 2, 3, 4); } 我用debug选项编译这个程序: gcc -g my_program.c 我使用gdb并使用intel语法反汇编test_function: (gdb) disassemble test_function Dump of assembler code for function test_function: 0x08048344 : push ebp 0x08048345 : mov ebp,esp 0x08048347 : sub […]

Intel x86到ARM汇编转换

我目前正在学习ARM汇编语言; 为此,我试图将一些x86 code (AT&T Syntax)为ARM汇编(Intel Syntax)代码。 __asm__(“movl $0x0804c000, %eax;”); __asm__(“mov R0,#0x0804c000”); 从这个文档中 ,我了解到在x86中,堆结构的Chunk 1从0x0804c000开始。 但是,当我尝试做同样的操作时,我收到以下错误: /tmp/ccfNZp9F.s:174: Error: invalid constant (804c000) after fixup 我假设问题是ARM只能加载32位指令。 Question 1: Any idea what would be the first chunk in case of ARM processors? Question 2: 从我之前的问题 ,我知道内存间接寻址是如何工作的。 下面写的片段是否做同样的工作? movl (%eax), %ebx LDR R0,[R1] 我正在使用ARMv7 Processor rev 4 (v7l)

如何初始化范围从0到N的SIMD向量?

我有以下函数我正在尝试编写一个AXV版本: void hashids_shuffle(char *str, size_t str_length, char *salt, size_t salt_length) { size_t i, j, v, p; char temp; if (!salt_length) { return; } for (i = str_length – 1, v = 0, p = 0; i > 0; –i, ++v) { v %= salt_length; p += salt[v]; j = (salt[v] + v + p) % […]