Tag: 组装

这个汇编代码什么都没做

我正在使用C文件,这是这样的: #define v2 0x560000a0 int main(void) { long int v1; v1 = ioread32(v2); return 0; } 并且我已经提取了这部分以在汇编中编写它: int main () { extern v1,v2; v1=ioread32(v2); return 0; } 我正在尝试使用armv4的汇编代码在v1中写入v2的值。 运用 arm-linux-gnueabi-gcc -S -march=armv4 assembly_file.c 我得到这个代码: .arch armv4 .eabi_attribute 27, 3 .fpu vfpv3-d16 .eabi_attribute 20, 1 .eabi_attribute 21, 1 .eabi_attribute 23, 3 .eabi_attribute 24, 1 .eabi_attribute 25, […]

使用内联汇编交换2个指针

我正在开发VS 2012,在64位操作系统下但输出可执行文件是32位。 最近我在摆弄交换算法。 我确实在C上实现了它; void swap(int *p1, int *p2) { *p1 = *p1 + *p2; *p2 = *p1 – *p2; *p1 = *p1 – *p2; } 但我也想用内联汇编(__asm)来做到这一点。 我试过这些代码; void aswap(int *p1, int *p2) { __asm { mov ebx, p1 mov ecx, p2 mov p1, ecx mov p2, ebx } } 并使用这些代码测试aswap() ; int a = […]

%al在C代码中注册

testb $1, %al je .L3 leal 1(%eax,%eax,2), %eax jmp .L4 我得到了上面的汇编代码,并要求将其翻译成c代码。 我知道几乎所有这些都在做什么,我只是不知道如何为%al寄存器做C代码。 如果它有帮助,这是汇编代码的其余部分 prob2: pushl %ebp movl %esp, %ebp movl 8(%ebp), %eax cmpl $1, %eax je .L1 .L6: testb $1, %al je .L3 leal 1(%eax,%eax,2), %eax jmp .L4 .L3: shrl %eax .L4: cmpl $1, %eax jne .L6 .L1: popl %ebp ret

fstcw程序集操作数类型不匹配

我试图在C中的内联汇编中使用指定的舍入模式对输入double进行舍入。为此,我需要使用“fstcw”获取FPU控制字,然后更改字中的位。 不幸的是我在第一行遇到错误: double roundD(double n, RoundingMode roundingMode) { asm(“fstcw %%ax \n” ::: “ax”); //clobbers return n; } 我收到的汇编程序错误是: “错误:’fstcw’的操作数类型不匹配。” 我的印象是这个代码片段应该在AX寄存器中存储FPU控制字,长度为16位,长度也是16位。 为了确保,我还使用EAX寄存器而不是AX测试了上述代码,并收到了同样的错误。 我可能会在这里失踪什么? 如果需要任何进一步的信息,请告诉我。

这个C程序的MIPS程序集转换如何?

我有一个关于Comp Sci类的简单问题,我正在将我的任务转换为MIPS汇编语言。 我相信我有一个正确的答案,但我想validation它。 这是C函数 int strlen(char *s) { int len; len=0; while(*s != ‘\0’) { len++; s++; } return len; } 谢谢! strlen: add $v0, $zero, $zero loop: lbu $t0, 0($a0) addi $a0, $a0, 1 addi $v0, $v0, 1 bne $t0, $zero, loop s_end: addi $v0, $v0, -1 j $ra

测试C代码中的SEGV在ARM Cortex M4处理器中经过的时间内出错

我正在为我的stm32f429板编写嵌入式操作系统的代码。 我正在测试此代码的使用时间: #include #include #include #include #include #include #define DEFAULT_DELAY 1 uint32_t m_nStart; //DEBUG Stopwatch start cycle counter value uint32_t m_nStop; //DEBUG Stopwatch stop cycle counter value #define DEMCR_TRCENA 0x01000000 /* Core Debug registers */ #define DEMCR (*((volatile uint32_t *)0xE000EDFC)) #define DWT_CTRL (*(volatile uint32_t *)0xE0001000) #define CYCCNTENA (1<= ticks) break; } } uint32_t CalcNanosecondsFromStopwatch(uint32_t nStart, […]

了解ATT组装(立即)

假设我有以下assembly线 movl $-1, %edi movl $1, %edx 我究竟要存储在%edi /%edx寄存器中。 基本上如果我将这个代码转换成C程序,我会将一些变量初始化为-1和1,因为这就是我看到它的方式,而这就是我认为我感到困惑的地方。 我明白,立即=“一些常数”,但这是什么意思?

在处理Aleph One文章时,64位系统上没有堆栈分配

我一直在搞乱来自Aleph One的“Smash the stack for Fun and Profit”,并发现在为我的64位处理器编译代码时,堆栈内存不能使用通常的“sub $ VALUE,% REG“。 这是函数源代码: void function() { char buffer1[5]; char buffer2[10]; int *ret; ret = buffer1 + 32; (*ret) +=8; } 这是编译版本 function: .LFB0: .cfi_startproc pushq %rbp .cfi_def_cfa_offset 16 .cfi_offset 6, -16 movq %rsp, %rbp .cfi_def_cfa_register 6 movl $1868654947, -16(%rbp) movb $0, -12(%rbp) leaq -16(%rbp), %rax addq […]

试图对一个函数进行逆向工程

我试图更多地了解x86中的汇编。 我在这里有一个神秘的function,我知道返回一个int并接受一个int参数。 所以它看起来像int mystery(int n){} 。 但我无法弄清楚C中的function。 该组件是: mov %edi, %eax lea 0x0(,%rdi, 8), %edi sub %eax, %edi add $0x4, %edi callq repz retq mov %edi, %eax shr %eax and $0x1, %edi and %edi, %eax retq 我不明白lea在这里做了什么以及它可能是什么样的function。

了解ATT汇编语言

C版: int arith(int x, int y, int z) { int t1 = x+y; int t2 = z*48; int t3 = t1 & 0xFFFF; int t4 = t2 * t3; return t4; } ATT大会版同样的程序: x at%ebp + 8,y at%ebp + 12,z at%ebp + 16 movl 16(ebp), %eax leal (%eax, %eax, 2), %eax sall $4, %eax // […]