标签: gnu-assembler

如何使用AVR的gnu汇编程序相对于PC跳转?

我有一个二进制文件,我使用avr-objcopy进行了反汇编.中断向量表如下所示:

00000000 :
    ; VECTOR TABLE
   0:   13 c0           rjmp    .+38        ;  0x28, RESET
   2:   b8 c1           rjmp    .+880       ;  0x374, INT0
   4:   fd cf           rjmp    .-6         ;  0x0
   6:   fc cf           rjmp    .-8         ;  0x0
   8:   fb cf           rjmp    .-10        ;  0x0
   a:   fa cf           rjmp    .-12        ;  0x0
   c:   f9 cf           rjmp    .-14        ;  0x0
   e:   f8 cf           rjmp    .-16        ;  0x0
  10:   f7 cf           rjmp    .-18        ;  0x0
  12:   c7 c1           rjmp    .+910       ;  0x3a2, TIMER1 OVF …

assembly avr gnu-assembler disassembly relative-addressing

2
推荐指数
1
解决办法
2374
查看次数

使用GCC(内联汇编程序)将两倍加载到FPU

我一直在尝试使用GCC内联汇编double将FP 加载到FPU FLD.

由于不熟悉AT&T语法并且没有在网络上找到任何内容,我非常感谢您的帮助.我的目的是要加载的地址aEAX,然后做FLD [EAX]...

double atl(double a, int adr) {
    __asm ("movl ptr %0,%%eax"::"r"(a));
    __asm ("fld qword (%eax)");
    //.... some other code here
    __asm("movl ptr %0,%%eax"::"r"(a));
    __asm("fst qword (%eax)");
    return a;
}
Run Code Online (Sandbox Code Playgroud)

double assembly gcc gnu-assembler fpu

2
推荐指数
1
解决办法
3438
查看次数

是否可以使用`as`组装和运行原始CPU指令?

这里有几个相关的问题.考虑一个仅包含以下两条指令的程序

movq 1, %rax
cpuid
Run Code Online (Sandbox Code Playgroud)

如果我把它扔进一个名为的文件Foo.asm,并运行as Foo.asm,as那么便携式GNU汇编器,我将a.out在我的系统上得到一个大小为665字节的文件.

如果我然后chmod 700 a.out尝试./a.out,我会收到一个错误说cannot execute binary file.

  1. 如果我只是想将两条asm指令翻译成二进制文件,为什么文件如此之大?
  2. 为什么不能执行二进制文件?我提供有效的指令,所以我希望CPU能够执行它们.
  3. 如何获得asm输入文件中指令的二进制操作码,而不是一堆额外的东西?
  4. 一旦得到3的答案,我怎样才能让我的处理器执行它们?(假设我没有运行特权指令.)

linux x86 assembly gnu-assembler

2
推荐指数
1
解决办法
1641
查看次数

为什么使用临时寄存器将值传递给段寄存器?

我一直在关注编写汇编的几个例子,他们使用临时寄存器将立即值传递给段寄存器.为什么在将其置于段寄存器之前需要将其置于某个寄存器中?
例:

movw $0x7c00, %ax
movw %ax, %ds
...
...
movw $0x6000, %ax
movw %ax, %ss
Run Code Online (Sandbox Code Playgroud)

为什么不直接把直接放在段寄存器中?

movw $0x7c00, %ds
...
movw $0x6000, %ss
Run Code Online (Sandbox Code Playgroud)

x86 assembly gnu-assembler

2
推荐指数
1
解决办法
852
查看次数

x86 示例程序中的分段错误

我正在阅读这本书《从头开始编程》,乔纳森·巴特利特。在这个第一次显示函数调用约定的程序上,我在像书中那样输入后运行它时遇到了分段错误。该函数只从堆栈中取出 2 个数字,并在 %eax 中返回第一个数字的第二个数字幂。

这是有问题的程序:

.code32

.section .data

.section .text

.globl _start
_start:

  pushl $3
  pushl $2
  call power
  addl $8, %esp

  pushl %eax

  pushl $2
  pushl $5
  call power
  addl $8, %esp

  popl %ebx

  addl %eax, %ebx

  movl $1, %eax
  int $0x80

.type power, @function
power:
  pushl %ebp
  movl %esp, %ebp
  subl $4, %esp

  movl 8(%ebp),  %ebx
  movl 12(%ebp), %ecx

  movl %ebx, -4(%ebp)

power_loop:
  cmpl $1, %ecx
  je end_power

  movl -4(%ebp), %eax
  imull %ebx, %eax
  movl …
Run Code Online (Sandbox Code Playgroud)

x86 assembly gnu-assembler ld segmentation-fault

2
推荐指数
1
解决办法
463
查看次数

气体与超级面料?

对于以太坊,天然气是一种反拒绝服务措施.Hyperledger Fabric中的等价物是什么,以避免滥用链码调用事务(INVOKE)?NVP是否应该检查此滥用行为?

gnu-assembler ethereum hyperledger hyperledger-fabric

2
推荐指数
1
解决办法
1145
查看次数

在GNU中以.intel_syntax区分内存与常量

我有一条用Intel语法编写的指令(使用gas作为汇编程序),看起来像这样:

mov rdx, msg_size
...
msg: .ascii "Hello, world!\n"
     .set msg_size, . - msg
Run Code Online (Sandbox Code Playgroud)

但是该mov指令正在汇编到mov 0xe,%rdx,而不是mov $0xe,%rdx我期望的那样。我应该如何编写第一条指令(或的定义msg_size)以获得预期的行为?

assembly gnu-assembler intel-syntax

2
推荐指数
1
解决办法
518
查看次数

将jmp指令用于非常量TSS段

JMP指令参考.

根据文档,我们可以执行jmp一个恒定的远段:

jmp 0x18:00
Run Code Online (Sandbox Code Playgroud)

这里,0x18是GDT全局描述符表中的有效段选择器.

jmp 可以与包含有效GDT条目的段寄存器一起使用,该条目是代码/数据段描述符:

mov es, 0x18
jmp es:0x0
Run Code Online (Sandbox Code Playgroud)

这里0x18是TSS(任务状态段)描述符,当跳转到时,CPU执行任务切换,自动将其状态保存到当前TSS中,然后填充新TSS中保存的状态.

但是,TSS是系统段描述符,因此无法加载到任何段寄存器中(如英特尔文档所建议).那么,如何在运行时使用动态分配的TSS跳转到任务?

我能想到的唯一方法是使用该iret指令,但我觉得它像一个hack,因为我需要修改链接字段,然后在EFLAGS中设置NT位以执行反向链接任务切换.

x86 assembly operating-system kernel gnu-assembler

2
推荐指数
1
解决办法
609
查看次数

为什么有必要在AT&T组装中使用"$"符号?

我是汇编语言的新手.我最近陷入了悲惨的境地.我创建了一个示例汇编程序,如下所示:

head.h

#define _Length_ 0x0A
Run Code Online (Sandbox Code Playgroud)

电源

movw $_LENGTH_, %ax
movw _LENGTH_, %ax
Run Code Online (Sandbox Code Playgroud)

现在两个MOV语句有什么区别?斧头的价值是什么?

我正在使用Ubuntu和GAS汇编程序(AT&T语法).

提前致谢

x86 assembly gnu-assembler x86-16

2
推荐指数
1
解决办法
108
查看次数

汇编器节指令有什么用?

我正在尝试学习ARM汇编。

编写此小型Hello World程序后:

                .global _start

                .text
_start:         ldr     R1,=msgtxt      
                mov     R2,#13          
                mov     R0,#1           
                mov     R7,#4           
                svc     0               

                mov     R7,#1           
                svc     0               


                .data
msgtxt:         .ascii  "Hello World!\n"

                .end
Run Code Online (Sandbox Code Playgroud)

我注意到我可以删除.text和.data指令,该程序也可以正常运行。

因此,我很好奇:我阅读的所有内容都强调了一个事实,即.text节将用于代码,而.data节将用于数据。但是在这里,在我眼前,它们似乎什么也没做!

因此,如果不将它们分别用于保存代码和数据,它们的真正目的是什么?

assembly arm gnu-assembler

2
推荐指数
2
解决办法
262
查看次数