Tag: x86

在c和内联汇编之间传递参数

我有一个关于在c和内联汇编之间传递参数的问题 我在将数组传递到内联汇编时遇到了麻烦。 我一直收到错误’错误:内存输入1无法直接寻址’ 以下是我的代码示例: void main() { char name[] = “thisisatest”; __asm__ (“\ .intel_syntax noprefix \n\ mov eax, %[name] \n\ inc (eax) \n\ ” :/*no output*/ :[name]”m”(name) ); } 这应该增加我的字符​​串的第一个字母(使它’u’),但它不会构建。 想法?

在不使用ebp的情况下实现堆栈回溯

当明确告诉编译器不使用ebp作为堆栈帧指针时,如何实现堆栈回溯?

如何从程序集更改指针值(x86)

这是我的C代码,用于更改指针值 #include #include typedef struct tcb tcb_t; struct tcb { void* sp; int id; }; void* changePointer(struct tcb*); int main(){ struct tcb* s; s=malloc(sizeof(struct tcb*)); printf(“%p\n”,changePointer(s)); printf(“%p\n”,s); return 0; } 这是我的汇编函数(x86) .text .globl changePointer changePointer: push %ebp movl %esp, %ebp movl 0x8(%ebp),%eax//original pointer value movl %ebp,%esp movl %ebp,0x8(%ebp) //it is to be the value after […]

在x86上以32位块实现类似学校的划分

假设我有两个大数字(定义如下),我想通过回退到x86 avaliable算法来实现它们的划分 0008768376 – 1653656387 – 0437673667 – 0123767614 – 1039873878 – 2231712290/0038768167 – 3276287672 – 1665265628 C = A / B 这些数字存储为32位无符号整数的向量。 第一个,A,是6-unsigned-int向量,B是3-unsigned-int长向量[这个字段中的每一个我自己命名为’digit’或’field’] 得到的C将是一些3-unsigned-int向量,但要计算它我需要回退到一些可用的x86(32位模式,虽然我也可以听到x64,但这是次要的)算术 告诉我如何计算至少第一个,最重要的C结果矢量字段.. 怎么做?

SSE字节和半字交换

我想使用SSE内在函数翻译此代码。 for (uint32_t i = 0; i > 16) & 0xFFFF) | (value << 16); } 是否有人知道执行16位字交换的内在函数?

使用SSE(x * x * x)+(y * y * y)进行乘法

我正在尝试使用SIMD优化此function,但我不知道从哪里开始。 long sum(int x,int y) { return x*x*x+y*y*y; } 反汇编函数如下所示: 4007a0: 48 89 f2 mov %rsi,%rdx 4007a3: 48 89 f8 mov %rdi,%rax 4007a6: 48 0f af d6 imul %rsi,%rdx 4007aa: 48 0f af c7 imul %rdi,%rax 4007ae: 48 0f af d6 imul %rsi,%rdx 4007b2: 48 0f af c7 imul %rdi,%rax 4007b6: 48 8d 04 02 […]

如何在x86 DOS程序集中读取键盘输入而不“消耗”它?

我需要编写一种可以从C代码调用的键记录function。 这意味着ac程序将调用一个名为startlog的汇编函数,该函数将指示开始记录按下的键,直到调用一个名为endlog的函数。 日志应该像这样工作:写入任何键的ascii值而不干扰startlog和endlog之间的C代码,这意味着如果C代码也需要读取输入(让我们说通过scanf,它可以正常工作)。 我设法通过将中断向量第9个条目(键盘按下的中断)更改为我写的将值写入文件的函数来编写记录器,并且它工作正常。 但是C代码没有得到输入。 基本上我所做的是读取使用int 21h按下的键,但是在读取ascii值后它被“消耗”所以我需要一种方法来再次模拟按键或读取值而不“消耗”它以便下一次键读取它读取相同的键。 (我用英语描述了代码,因为它是冗长而笨拙的汇编代码)

在32位Open Watcom C中生成FAR跳转指令

我需要生成一个远跳指令来跳转到另一个ISR(中断服务程序)。 我正在开发一个32位FreeDOS应用程序。 在阅读了OW手册( cguide.pdf和clr.pdf )之后,我想出了两种无需 任何警告或错误即可成功编译的方法。 /* Code Snippet #1 */ #pragma aux old08 aborts ; void (__interrupt __far *old08)(void); // function pointer declaration void __interrupt __far new08(void) { /* Do some processing here … */ (*old08)(); /* OW will now generate a jump inst. instead of call*/ } 我想出的另一种方法是: /* Code Snippet #2 */ […]

计算32位数组的奇数位置中有多少1个

我正在实现一个简单的汇编函数,该函数通过c中的程序调用,以计算32位数组奇数位置中有多少1个。 传递给函数的第一个参数是指向数组的指针,第二个参数是元素的数量。 我不明白它无限循环的作用。 //汇编代码 .globl ones_in_odds .type ones_in_odds,@function ones_in_odds: pushl %ebp movl %esp,%ebp movl 8(%ebp),%ecx movl 12(%ebp),%esi #xorl %edi,%edi xorl %eax,%eax subl $-1,%esi startloop: cmpl $0,%esi jl endloop movl (%ecx,%esi,4),%edx xorl %edi,%edi innerloop: cmpl $16,%edi jg startloop shrl %edx shrl %edx adcl $00,%eax incl %edi jmp innerloop decl %esi jmp startloop endloop: movl %ebp,%esp popl […]

Visual-C ++内联汇编程序两个偏移量的差异

我正在将一大堆代码从MASM移植到C内联汇编程序(x86,Windows,MS VC)。欺骗不是真正的代码,只是欺骗提出一个想法。 假设我将一些数据定义为静态数组,甚至是两个标签之间的代码块,我需要获得它的大小。 label1: bla bla bla label2: …. mov eax, (offset label2 – offset label1) 这样的代码在MASM中像魅力一样工作,但在CI中得到以下错误消息:“错误C2425:’ – ‘:’第二个操作数’中的非常量表达式”我可以编译: mov eax, offset label1 mov eax, offset label2 我希望编译器在编译时评估(偏移label1 – 偏移label2),但看起来我错了。 我也不能添加偏移量(为什么?这些只是在编译期间添加的两个整数……?)当然,我可以获得mov eax,offset label2 mov edx,offset label1 sub eax,edx编译,但这是一个额外的代码只是为了计算常数。 有人可以解释一下,我的代码有什么问题吗? 这可能是搬迁造成的吗? 如何推动它? 期待一个答案,谢谢。