gnu-assembler相关内容
两段示例代码;首先将一些 C++ 代码调用到程序集中: /* test1.cc */#include extern "C" 无效 blah();外部“C"无效的东西(){printf("这是一个测试\n");}int main(int argc, char *argv[]) {废话();返回0;} ...然后是程序集: .file "test2.s".文本.globl 等等
..
我正在使用 GNU 作为基于 ARM Cortex-M3 的微控制器(Thumb 2 指令集)的汇编程序. 在一些示例代码中,我发现像 .size、.section 和 .type 这样的指令是 ELF 指令.举个例子: .section .text.Reset_Handler.weak Reset_Handler.type Reset_Handler, %function重置处理程序:
..
我正在尝试组装一小段 x86 代码.我在一台 32 位机器上,我编写了以下代码.它应该只是将值添加到 eax 然后返回.我意识到不会有任何输出.当我使用 编译它时 gcc main.S -o main 它编译没有错误.但是当我运行它时会出现段错误(gdb 声称它在第一条 movl 指令上出现段错误).main.S 中包含以下代码.我做错了什么? .text.globl 主要主要的:推%
..
我正在尝试创建一个程序来仅在屏幕上写入参数.我创建了一些程序来获取 C 函数参数,或者我使用 C 将参数发送到我的 asm 程序.有没有办法只使用汇编程序获取程序参数 例如: ./程序“文本" 我正在使用 (Gnu 汇编程序) 通常我使用这些参数 [esp+4] 因为 esp 是程序/函数调用指针,但在纯 asm 中它没有获取命令行参数. 有没有办法做到这一点? 我
..
我已经用谷歌搜索了很多,但无法弄清楚括号 () 的含义.另外,我看到一些语法为 movl 8(%ebp), %eax 有人可以给我推荐一些好的参考资料吗?我无法在 Google 的前 20 个结果中找到任何结果. 解决方案 %eax 是注册 EAX;(%eax) 是地址包含在寄存器EAX中的内存位置;8(%eax) 是地址为 EAX 值加 8 的内存位置.
..
我正在重新学习我在非常旧的 MS-DOS 机器上使用的汇编程序!!! 这是我对这个函数应该是什么样子的理解.当尝试将 0xffffffff 放入 ecx 时,它编译但因 SIGSEGV 而崩溃. 代码在具有 32 位 Debian 9 的 VM 中运行.任何帮助将不胜感激. int getStringLength(const char *pStr){int len = 0;字符 *
..
我已经设法制作了一个适用于 QEMU 2.0.0 Ubuntu 14.04 的最小引导扇区: .code16.global _start_开始:命令行mov $msg, %simov $0x0e, %ah环形:lodsb或 %al, %aljz停止整数 $0x10jmp循环停:高留言:.asciz “你好世界".org 510.word 0xaa55 编译: as -o main.o mai
..
编译以下指令时: movl 4(%ebp), 8(%ebp) 我得到:太多的内存引用. 这是怎么回事? 解决方案 括号前的数字是一个字节偏移量(这会导致内存引用发生),并且movl.您需要先将值临时移动到寄存器中. movl 4(%ebp), %ecxmovl %ecx, 8(%ebp)
..
所以我想在引导扇区中添加填充.假设,目前只有一个无限循环:jmp ..该扇区的长度需要为 512 字节.此外,还需要在末尾添加魔术数字 0xaa55. jmp ..跳过 508, 0.word 0xaa55 但是如果我想打印一些东西但不想计算所有字节以将其填充到正确的大小怎么办? 在 Intel/NASM 语法中,它是: ;打印一些东西乘以 510-($-$$) db 0dw 0xaa55
..
我很想知道是否有任何特殊的 GAS 语法可以实现与 NASM 示例中相同的功能: SECTION .datamsg: db "Hello World",10,0 ;以 0 结尾的字符串.len: 等 $-msg ;“$"表示当前地址. 特别是我对表示当前地址的符号 $ 感兴趣. 解决方案 gas 和 NASM 之间有一个有用的比较:http://www.ibm.com/develope
..
MOV 可能是每个人在学习 ASM 时学到的第一条指令. 刚刚遇到一本书Rajat Moona 撰写的 GNU/Linux 中的 IA32 架构汇编语言编程链接已删除) 但我了解到它是MOV dest, src.就像“用 src 加载 dest".甚至 Wiki 也是如此. 我不是说作者错了.我知道他是对的.但我在这里错过了什么? btw.. 他正在使用 GCC 的 as
..
似乎每一行后面都有一个 .CFI 指令,而且这些指令也有很多种,例如,.cfi_startproc ,.cfi_endproc 等等.更多信息. .file "temp.c".文本.globl 主.type main, @function主要的:.LFB0:.cfi_startprocpushq %rbp.cfi_def_cfa_offset 16movq %rsp, %rbp.cfi_off
..
我有一条用 Intel 语法编写的指令(使用 gas 作为我的汇编程序),如下所示: mov rdx, msg_size...msg: .ascii "你好,世界!\n".set msg_size, .- 味精 但是那条 mov 指令正在被组装成 mov 0xe,%rdx,而不是我所期望的 mov $0xe,%rdx.我应该如何编写第一条指令(或 msg_size 的定义)以获得预期的行为?
..
我有一些 NASM 文件,它们通常具有以下结构: [BITS 64][ORG 0x0000000000200000]开始:...退 我是这样组装它们的: nasm -f bin abc.asm 我想改用 GAS 编写其中的一些.两个问题: 我应该在 GAS 中使用哪些指令?我找到了“.org"指令,但 GAS 似乎没有“.bits"指令. 我应该向 gcc 或 as 传递什么
..
作为编译器项目的一部分,我必须为 x86 编写 GNU 汇编代码来比较浮点值.我试图找到有关如何在线执行此操作的资源,并且据我所知,它的工作方式如下: 假设我要比较的两个值是浮点堆栈上的唯一值,那么 fcomi 指令将比较这些值并设置 CPU 标志,以便 je、jne、jl、...指令都可以使用. 我之所以这么问是因为这只有时有效.例如: .section .datamsg: .as
..
0x0000000000400553 : mov -0x4(%rbp),%eax0x0000000000400556 :cltq0x0000000000400558 : shl $0x3,%rax0x000000000040055c : mov %rax,%rdx 其实我的程序很简单: 5 int main(int argc, char *
..
我已经使用 AT&T 语法编写了一个用于 GNU 汇编程序的程序: .data格式:.ascii "%d\n".文本.global 主主要的:mov $格式,%rbx移动 (%rbx), %rdi移动 $1, %rsi调用 printf退 我使用 GCC 来组装和链接: gcc -o main main.s 我用这个命令运行它: ./main 当我运行程序时,我遇到了
..
考虑 x64 Intel 程序集中的以下变量引用,其中变量 a 在 .data 部分声明: mov eax, dword ptr [rip + _a] 我无法理解此变量引用的工作原理.由于a是变量运行时地址对应的符号(带重定位),如何[rip + _a]解引用a?确实,rip保存的是当前指令的地址,它是一个很大的正整数,所以加法会导致a的地址不正确? 相反,如果我使用 x86 语法(非常
..
我需要一些帮助来理解 GCC 这样做的原因 主要:pushl %ebpmovl %esp, %ebp还有 $-16, %esp # ???subl $48, %esp # ???movl $8, 16(%esp)移动 $4, 20(%esp) 为什么要先减16,然后再减48?做 subl $64, %esp 不是更容易吗? 解决方案 andl $-16, %esp # ??? 上一行
..
如何在用于 AMD64 架构的 Linux 汇编程序中使用 RIP 相对寻址?我正在寻找一个使用 AMD64 RIP 相对寻址模式的简单示例(一个 Hello world 程序). 例如,以下 64 位汇编程序可以正常(绝对寻址)运行: .text.global _start_开始:mov $0xd, %rdxmov $msg, %rsi推送 $0x1流行%rax移动 %rax, %rdi
..