我有一个二进制文件,我使用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 … 我一直在尝试使用GCC内联汇编double将FP 加载到FPU FLD.
由于不熟悉AT&T语法并且没有在网络上找到任何内容,我非常感谢您的帮助.我的目的是要加载的地址a到EAX,然后做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) 这里有几个相关的问题.考虑一个仅包含以下两条指令的程序
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.
asm指令翻译成二进制文件,为什么文件如此之大?asm输入文件中指令的二进制操作码,而不是一堆额外的东西?我一直在关注编写汇编的几个例子,他们使用临时寄存器将立即值传递给段寄存器.为什么在将其置于段寄存器之前需要将其置于某个寄存器中?
例:
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) 我正在阅读这本书《从头开始编程》,乔纳森·巴特利特。在这个第一次显示函数调用约定的程序上,我在像书中那样输入后运行它时遇到了分段错误。该函数只从堆栈中取出 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) 我有一条用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)以获得预期的行为?
根据文档,我们可以执行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位以执行反向链接任务切换.
我是汇编语言的新手.我最近陷入了悲惨的境地.我创建了一个示例汇编程序,如下所示:
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语法).
提前致谢
我正在尝试学习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节将用于数据。但是在这里,在我眼前,它们似乎什么也没做!
因此,如果不将它们分别用于保存代码和数据,它们的真正目的是什么?
gnu-assembler ×10
assembly ×9
x86 ×5
arm ×1
avr ×1
disassembly ×1
double ×1
ethereum ×1
fpu ×1
gcc ×1
hyperledger ×1
intel-syntax ×1
kernel ×1
ld ×1
linux ×1
x86-16 ×1