gnu-assembler相关内容

如何在 x86 汇编中的数据段中写入常量

我正在编写一个汇编程序(使用 icc 作为汇编程序).我需要在数据部分写一些常量,以便在主程序中进行rip相对加载,例如以下指令: vmovdqu msg(%rip),%ymm0 我现在把数据部分写成这样: .data味精:0x00000000 0x01000000 0x02000000 0x03000000 0x04000000 0x05000000 0x06000000 0x07000 ..
发布时间:2021-09-29 19:33:40 其他开发

函数调用如何在 Linux 上的 x86 32 位程序集中工作?

我正在从 Jonathan Bartlett 的“从头开始编程"一书中学习 GNU 汇编. 在讨论函数调用和堆栈的主题时,我无法理解它的工作原理. 以下是书中的内容: 在执行函数之前,程序将函数的所有参数按与记录相反的顺序压入堆栈.然后程序发出一个调用指令,指示它希望启动哪个函数.call 指令做了两件事.首先它将下一条指令的地址,即返回地址,压入堆栈.然后它修改指令指针 (%e ..
发布时间:2021-09-29 19:32:44 其他开发

警告:没有‘*’的间接调用

有这个简单的组装: .text.globl 主字符串:.asciz "%i\n";添加:推 %rbp移动 %rsp, %rbpmovl %esi, %eaxaddl %edi, %eax弹出 %rbp回复主要的:mov $1, %esimov $2, %edilea add(%rip), %rax调用 %rax #这里有什么问题?rax 应该包含添加的第一条指令移动 %eax, %esi异或 % ..
发布时间:2021-09-29 19:31:52 其他开发

从 Windows 移植到 Linux.汇编命令翻译

我最近开始学习从 Windows 移植到 Linux.我一直在将程序从 Intel 语法转换为 AT&T 语法,并将其从 x32 转换为 x64.而且由于我对汇编程序特别是 AT&T 来说是新手,所以我在移植时遇到了一些麻烦.顺便提一下:我故意不使用 .intel_syntax 指令. 所以我不得不翻译这些命令: RTLWriteIntegerBuffer: TIMES 3 DB 0x90 ..
发布时间:2021-09-04 18:41:30 其他开发

如何将向量中的值相互添加

在我的代码中我解决了积分 y=x^2-4x+6 我使用了 SSE - 它允许我一次操作 4 个值.我编写了一个程序,用 0 到 5 的值将这个积分分解为五个 4 元素向量 n1、n2、n3、n4. .datan1: .float 0.3125,0.625,0.9375,1.25n2: .float 1.5625,1.875,2.1875,2.5n3:.float 2.8125,3.12500 ..
发布时间:2021-08-27 19:47:52 其他开发

如何在 x86-64 Linux 上的 GAS 程序集中通过 GOT 访问 C 全局变量?

我的问题 我正在尝试编写一个共享库(不是可执行文件,所以请不要告诉我使用 -no-pie)与单独文件中的程序集和 C(不是内联程序集). 我想通过汇编代码中的全局偏移表访问一个 C 全局变量,因为调用的函数可能在任何其他共享库中定义. 我知道 PLT/GOT 的东西,但我不确定如何告诉编译器为链接器正确生成重定位信息(语法是什么),以及如何告诉链接器实际重定位我的代码信息(链接器 ..
发布时间:2021-07-23 20:20:43 服务器开发

Printf 带气体组件

我不知道为什么如果字符串末尾缺少 \n(LF - newline),我无法在 GAS 程序集中用 printf 打印任何内容.如果我把换行符 \n 打印出来,但如果我删除 \n 行不打印.谁能告诉我为什么? .extern printf.section .data你好:.string “你好!"# 当 \n 丢失时不以这种方式打印.section .text.globl _start_开始:没有 ..
发布时间:2021-06-21 19:04:40 服务器开发

"无效的符号重新定义& quot;LLVM上的内联ASM

我有一个Xcode(4.5.2)项目,可以使用Debug配置很好地构建.但是,既然我现在切换到构建Release配置,我遇到了一个问题:我的内联汇编函数之一是收到错误无效的符号重新定义.搜查该错误消息后,发现有几个人遇到了该编译器错误,但没有任何含义.这是函数,其中的错误行带有注释: inline int MulDivAdd(int nNumber,int nNumerator,int nDe ..
发布时间:2021-05-30 19:40:01 C/C++开发

无法使用gcc编译asm hello世界

这是 hello.s 中的代码 .datahello_str:.string“你好,世界!\ n".set hello_str_length,.-hello_str-1.文本.globl主.type main,@功能主要的:movl $ 4,%eaxmovl $ 1,%ebxmovl $ hello_str,%ecxmovl $ hello_str_length,%edx整数$ 0x80mo ..
发布时间:2021-05-09 20:56:01 其他开发

在GNU汇编程序宏中引用操作数/参数

我目前正在尝试理解汇编语言中的宏的概念,尤其是在IA-32(x86)的GNU汇编器,AT& T语法中.我大学的幻灯片说: #如何定义宏:.macro写字符串movl字符串,%esi致电printstr.endm#如何使用宏:写一个字符串 但是,这对我不起作用.我正在使用 gcc 编译代码. .datamsg:.string“结果为%d.\ n".文本.global主.macro add_ ..
发布时间:2021-05-09 20:55:42 其他开发

.quad指令如何在汇编中工作?

我无法理解 .quad 函数在汇编中的工作方式. 根据我在网上阅读的内容,它会为当前部分中的每个表达式生成一个64位二进制补码值.我了解二进制补码是什么,以及该部分引用 .quad 的那一行的事实. 通常在汇编中调用 .quad 的位置和时间? 另外,为什么要使用 .quad 生成任何内容? 解决方案 .quad 指令用于定义64位数字值. .byte 指令的工作方式类似. ..
发布时间:2021-04-30 20:16:42 其他开发

在汇编中声明和访问字符串(32位Debian CommandLine OS)

首先,这是一项家庭作业,但我终生无法在网上找到任何可靠的资源来解释教授使用的语法. 我想在这方面先做功课,以免直接得到答案,而是要求解释,以便将来学习.我的教授不是最擅长提供学习这些知识的资源,因此我决定向SO的优秀人才寻求帮助. 任务很简单.使用一个字符串数组(北约军事字母),从用户那里接收一系列单词,然后以军事字母的形式将这些单词输出到屏幕上. 因此,例如,输入"Feed"被 ..
发布时间:2021-04-16 20:17:46 其他开发

宏在GAS中替换为常数

X86 GNU Assembly上的那个宏怎么了?表示链接期间未定义符号S. .macro S size=40 \size .endm 我正在使用它 mov %eax, S 解决方案 宏用于为您经常使用的代码创建模板,而不是输入常数.因此,我不相信汇编程序会在表达式中进行宏扩展.由于只需要一个数字,因此可以使用.set定义一个常量. .set S, 40 mov %ea ..
发布时间:2020-11-16 03:40:31 其他开发

GNU汇编中的1b和1f

我正在分析linux异常代码. 顺便说一句,我无法理解gnu汇编语法. svc_preempt: mov r8, lr 1: bl preempt_schedule_irq @ irq en/disable is done inside ldr r0, [tsk, #TI_FLAGS] @ get new tasks TI_FLAGS ..
发布时间:2020-11-16 03:37:41 其他开发

64位GCC混合32位和64位指针

尽管代码可以正常工作,但我对编译器似乎混合使用相同类型的32位和64位参数的决定感到困惑.具体来说,我有一个接收三个char指针的函数.查看汇编代码,将三个中的两个作为64位指针(按预期方式)传递,而将第三个本地常量(但仍然是字符串)作为32位指针传递.我看不到当第3个参数不是完全加载的64位指针时函数如何知道.显然,只要高端为0都没有关系,但我认为它并没有努力确保这一点.在此示例中,任何东西都可 ..
发布时间:2020-11-12 23:46:52 其他开发