Tag: assembly

我们可以使用运算符“&”内联GCC ARM汇编吗?

我们可以使用运算符“&”内联GCC ARM汇编吗? 如果是,那么我有一个结构core_regx,我需要将该结构的成员r0的地址传递给下面提到的代码: asm volatile(“ldr r3, [%0,#0]”:: “r” (&(core_reg->r0))); 请检查此代码是否正确。

128乘法和除法的内在函数

在x86_64中,我知道mul和div的代码通过将低64位放在rax中而高位放在rdx寄存器中来支持128个整数。 我在intel intrinsics指南中寻找某种内在的function,我找不到一个。 我正在写一个大字库,字大小为64位。 现在我正在用这样一个单词进行划分。 int ubi_div_i64(ubigint_t* a, ubi_i64_t b, ubi_i64_t* rem) { if(b == 0) return UBI_MATH_ERR; ubi_i64_t r = 0; for(size_t i = a->used; i– > 0;) { ubi_i64_t out; __asm__(“\t” “div %[d] \n\t” : “=a”(out), “=d”(r) : “a”(a->data[i]), “d”(r), [d]”r”(b) : “cc”); a->data[i] = out; //ubi_i128_t top = (r <data[i]; //r = […]

MSVC内联ASM到GCC

我正在尝试处理MSVC和GCC编译器,同时更新此代码库以使用GCC。 但我不确定GCC内联ASM是如何工作的。 现在我不擅长将ASM翻译成C,否则我只会使用C而不是ASM。 SLONG Div16(signed long a, signed long b) { signed long v; #ifdef __GNUC__ // GCC doesnt work. __asm() { #else // MSVC __asm { #endif mov edx, a mov ebx, b mov eax, edx shl eax, 16 sar edx, 16 idiv ebx mov v, eax } return v; } signed long ROR13(signed […]

编译时asm中不可能的约束

在我的Atmel ASF项目中,我正在尝试构建以下内联asm代码。 但是我在编译时遇到了不可能的限制。 编译器指向此行__asm__ __volatile__ ,我错过了什么? #define OUTPORT PORTD #define OUTBIT 3 // PD.3 uint8_t rport ,rbits; uint8_t *buf = message; asm volatile( “in __tmp_reg__, __SREG__ \n\t” // 1 Save SREG for later “cli \n\t” // 1 Clear interrupts “in %[rport], %[port] \n\t” // 1 Move PORTB adress to rport : //Outputs [rport] “=&r” (rport) […]

SPARC大会问题

我想在我的C程序中编写一个非常简单的内联汇编程序,然后将本地寄存器%l0 – %l7设置为不同的值。 我尝试了以下简单的方法: asm volatile ( “.text\n\t” “mov 0, %%l0 \n\t” “mov 1, %%l1 \n\t” “mov 2, %%l2 \n\t” “mov 3, %%l3 \n\t” “mov 4, %%l4 \n\t” “mov 5, %%l5 \n\t” “mov 6, %%l6 \n\t” “mov 7, %%l7 \n\t” ); 不幸的是,汇编器告诉:每条指令的非法操作数。 有人可以非常高兴地指出我如何正确地将立即值传递给SPARC汇编程序吗? 非常感谢! 编辑:谢谢克里斯,我做了你建议的更改,但Sparc编译器仍然告诉一些关于非法操作数…

MASM:从程序集访问全局C变量

我正在编写一个程序来转换图像并比较C和汇编中处理数据的速度。 我有3个项目: C的主要项目 C中的DLL转换图像 ASM中的DLL转换图像 在C DLL头文件中,我只是写道: #ifdef PROJEKTC_EXPORTS #define PROJEKTC_API __declspec(dllexport) #else #define PROJEKTC_API __declspec(dllimport) #endif … extern PROJEKTC_API unsigned int ThreadID; PROJEKTC_API void __cdecl funkcjaC(void* Args); 包含此标题后,我可以在主项目和C DLL中访问变量ThreadID。 当我尝试在ASM中执行相同操作时,问题就开始了。 我在extern ASMThreadID:dword块中尝试过像extern ASMThreadID:dword这样的构造,但它不起作用。 我得到的错误: error LNK2019: unresolved external symbol _ASMThreadID referenced in function _MyProc1 我觉得这是1-2行代码的问题,但我无法弄清楚应该使用哪条指令。 我通过ASM中的模块定义文件链接项目,并将ASM.lib文件添加到主项目的链接器 – >输入中。 你有什么建议吗?

动态生成的代码在错误的地址中执行

这是一个UWP应用程序。 我在ARM / Release版本中遇到此问题。 变量指向extra_memory,其中每次在重新编译之前由protect_readwrite更改内存的保护,并且每次在执行重新编译的代码之前由protect_exec更改。 基本上extra_memory是我们重新编译代码的地方。 首先,在调用new_dynarec_init以将extra_memory的保护更改为读取和写入之后,输出指向extra_memory的指针,以便我们可以使用out作为执行重新编译代码的入口点。 new_recompile_block是执行重新编译的函数,从函数new_dyna_start调用。 extern char extra_memory[33554432]; #define BASE_ADDR ((int)(&extra_memory)) void *base_addr; u_char *out; void new_dynarec_init() { protect_readwrite(); base_addr = ((int)(&extra_memory)); out = (u_char *)base_addr; } int new_recompile_block(int addr) { //if(g_cp0_regs[CP0_COUNT_REG]==365117028) tracedebug=1; protect_readwrite(); //the recompiling code here …… protect_exec(); return 0; } void protect_readwrite() { #if NEW_DYNAREC == NEW_DYNAREC_ARM PVOID addr […]

IA32注册地址

我有几个互相关联的问题让我失望。 我正在进行一项任务,我必须在gdb查看汇编代码,以找到使C程序正常工作的正确输入。 为了测试这个,我输入一个由一些数字组成的测试字符串,并逐步读取/读取程序集以预测其行为并找出解决方案。 这是主要问题:在某一点上,我的整个输入字符串存储在%eax寄存器中。 我打电话的时候: x/a $eax 它返回一个hex,我假设它是%eax的地址。 此时,hex的最后一个字节会根据输入而变化。 程序在输入字符串上调用strtol()后不久,从字符串中删除第一个数字,并将缩短的字符串放回%eax 。 事情变得令人困惑:似乎无论原始输入有多长或附加输入有多长,当我在$eax上调用x/a时,返回的hex值的最后一个字节似乎总是等于32。是一个问题,因为在使用%eax地址的最后一个字节之后不久有一个cmp测试,而数字32会导致程序故意崩溃。 我误解了x/a的使用,事实上,我返回的hex根本不是一个地址吗? 输入的大小是否会影响注册表的地址? 任何其他有用的提示可以帮助我在这种情况下? 非常感谢

SSE FPU并行

我想知道是否可以将SSE与x87并行使用。 所以考虑以下伪代码, 1:sse_insn 2:x87_insn 管道是否会并行执行1和2,假设它们可以并行执行?

编写MIPS机器指令并从C执行它们

我正在尝试用C和MIPS编写一些自修改代码。 由于我想稍后修改代码,我正在尝试编写实际的机器指令(而不是内联汇编)并尝试执行这些指令。 有人告诉我,有可能只是malloc一些内存,在那里写指令,指向它的C函数指针,然后跳转到它。 (我在下面举例说明) 我已经尝试使用我的交叉编译器(sourcery codebench工具链)并且它不起作用(是的,在后面的视线中我认为它确实看起来很幼稚)。 我怎么能正确地做到这一点? #include #include #include void inc(){ int i = 41; uint32_t *addone = malloc(sizeof(*addone) * 2); //we malloc space for our asm function *(addone) = 0x20820001; // this is addi $v0 $a0 1, which adds one to our arg (gcc calling con) *(addone + 1) = 0x23e00000; //this is […]