gnu-assembler相关内容
我正在编写一个汇编程序(使用 icc 作为汇编程序).我需要在数据部分写一些常量,以便在主程序中进行rip相对加载,例如以下指令: vmovdqu msg(%rip),%ymm0 我现在把数据部分写成这样: .data味精:0x00000000 0x01000000 0x02000000 0x03000000 0x04000000 0x05000000 0x06000000 0x07000
..
我正在从 Jonathan Bartlett 的“从头开始编程"一书中学习 GNU 汇编. 在讨论函数调用和堆栈的主题时,我无法理解它的工作原理. 以下是书中的内容: 在执行函数之前,程序将函数的所有参数按与记录相反的顺序压入堆栈.然后程序发出一个调用指令,指示它希望启动哪个函数.call 指令做了两件事.首先它将下一条指令的地址,即返回地址,压入堆栈.然后它修改指令指针 (%e
..
从我找到的所有文档中,没有提到像英特尔 x86 语法中的 offset[var+offset2] 这样的语法,但是 GCC 有以下标志 gcc -S hello.c -o - -masm=intel 对于这个程序 #includeint main(){字符 c = 'h';putchar(c);返回0;} 生产 .file "hello.c".intel_syntax nopr
..
有这个简单的组装: .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异或 %
..
尝试在 Ubuntu 16.04.4 上构建 Jonesforth(32 位 GNU 汇编程序)时64 位(Xenial Xerus),我看到以下内容: ~/src/jonesforth $ makegcc -m32 -nostdlib -static -o jonesforth jonesforth.Sjonesforth.S:1154:24: 致命错误: asm/unistd.h: 没有这样
..
我最近开始学习从 Windows 移植到 Linux.我一直在将程序从 Intel 语法转换为 AT&T 语法,并将其从 x32 转换为 x64.而且由于我对汇编程序特别是 AT&T 来说是新手,所以我在移植时遇到了一些麻烦.顺便提一下:我故意不使用 .intel_syntax 指令. 所以我不得不翻译这些命令: RTLWriteIntegerBuffer: TIMES 3 DB 0x90
..
在我的代码中我解决了积分 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
..
我的问题 我正在尝试编写一个共享库(不是可执行文件,所以请不要告诉我使用 -no-pie)与单独文件中的程序集和 C(不是内联程序集). 我想通过汇编代码中的全局偏移表访问一个 C 全局变量,因为调用的函数可能在任何其他共享库中定义. 我知道 PLT/GOT 的东西,但我不确定如何告诉编译器为链接器正确生成重定位信息(语法是什么),以及如何告诉链接器实际重定位我的代码信息(链接器
..
我不知道为什么如果字符串末尾缺少 \n(LF - newline),我无法在 GAS 程序集中用 printf 打印任何内容.如果我把换行符 \n 打印出来,但如果我删除 \n 行不打印.谁能告诉我为什么? .extern printf.section .data你好:.string “你好!"# 当 \n 丢失时不以这种方式打印.section .text.globl _start_开始:没有
..
我有一个Xcode(4.5.2)项目,可以使用Debug配置很好地构建.但是,既然我现在切换到构建Release配置,我遇到了一个问题:我的内联汇编函数之一是收到错误无效的符号重新定义.搜查该错误消息后,发现有几个人遇到了该编译器错误,但没有任何含义.这是函数,其中的错误行带有注释: inline int MulDivAdd(int nNumber,int nNumerator,int nDe
..
我发现了一个名为:ProgrammingGroundUp-1-0-booksize.pdf的pdf文件,其中一个项目是制作一个汇编程序,该程序将文件吸收并将其转换为大写字母, .section .data###### CONSTANTS #########系统电话号码.equ SYS_OPEN,5.equ SYS_WRITE,4.equ SYS_READ,3.equ SYS_CLOSE,6.e
..
这是 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
..
我目前正在尝试理解汇编语言中的宏的概念,尤其是在IA-32(x86)的GNU汇编器,AT& T语法中.我大学的幻灯片说: #如何定义宏:.macro写字符串movl字符串,%esi致电printstr.endm#如何使用宏:写一个字符串 但是,这对我不起作用.我正在使用 gcc 编译代码. .datamsg:.string“结果为%d.\ n".文本.global主.macro add_
..
我无法理解 .quad 函数在汇编中的工作方式. 根据我在网上阅读的内容,它会为当前部分中的每个表达式生成一个64位二进制补码值.我了解二进制补码是什么,以及该部分引用 .quad 的那一行的事实. 通常在汇编中调用 .quad 的位置和时间? 另外,为什么要使用 .quad 生成任何内容? 解决方案 .quad 指令用于定义64位数字值. .byte 指令的工作方式类似.
..
我可以使用GCC将汇编代码文件转换为可重新分配的文件. gcc -c source.S -o object.o -O2 优化选项是否有效?我可以期望GCC来优化我的汇编代码吗? 解决方案 否. GCC将您的汇编源传递给预处理器,然后传递给汇编器.任何时候都不会进行任何优化.
..
首先,这是一项家庭作业,但我终生无法在网上找到任何可靠的资源来解释教授使用的语法. 我想在这方面先做功课,以免直接得到答案,而是要求解释,以便将来学习.我的教授不是最擅长提供学习这些知识的资源,因此我决定向SO的优秀人才寻求帮助. 任务很简单.使用一个字符串数组(北约军事字母),从用户那里接收一系列单词,然后以军事字母的形式将这些单词输出到屏幕上. 因此,例如,输入"Feed"被
..
X86 GNU Assembly上的那个宏怎么了?表示链接期间未定义符号S. .macro S size=40 \size .endm 我正在使用它 mov %eax, S 解决方案 宏用于为您经常使用的代码创建模板,而不是输入常数.因此,我不相信汇编程序会在表达式中进行宏扩展.由于只需要一个数字,因此可以使用.set定义一个常量. .set S, 40 mov %ea
..
我正在分析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
..
我不确定这些推送线有什么区别. (从Linux的x86/entry/calling中删除 .h ,清除了“零或零"清除.) .macro PUSH_AND_CLEAR_REGS rdx=%rdx rax=%rax save_ret=0 pushq \rdx pushq \rax pushq %r11 pushq %r12 .endm 是否都推入堆栈?还是前
..
尽管代码可以正常工作,但我对编译器似乎混合使用相同类型的32位和64位参数的决定感到困惑.具体来说,我有一个接收三个char指针的函数.查看汇编代码,将三个中的两个作为64位指针(按预期方式)传递,而将第三个本地常量(但仍然是字符串)作为32位指针传递.我看不到当第3个参数不是完全加载的64位指针时函数如何知道.显然,只要高端为0都没有关系,但我认为它并没有努力确保这一点.在此示例中,任何东西都可
..