assembly相关内容
基本上,您可以让汇编代码在最后一行结束后不断地编写新代码,以便它可以永远保持直线运行,尽管开始的代码量是有限的吗?不允许循环。 推荐答案 它必须是为某种带有无限磁带的机器(如图灵机)组装的,否则最终会到达地址空间的末尾。 除非您对指令指针具有定义明确的无错误回绕语义。您将需要一台在其可用地址空间中没有任何间隙的计算机(因此不是x86-64),而是具有PC相对寻址(因此不是i386
..
我了解instruction pipelining的基本原理。 我还了解到某些指令可能需要更长时间才能执行(cycles per instruction)。 但我不明白两者之间的联系。 我看到的所有流水线图似乎都有“完美”的指令,它们都有相同的长度(周期数)。 但是,如果第一条指令需要5个周期,而第二条指令需要3个周期,该怎么办?CPU是否停顿了2个周期? 这个摊位叫
..
这是我第二次问这个问题;第一次有人回复了,但我花了很长时间才回复,因此没有得到充分的理解。 我试图做的是更多地了解现代体系结构的取指令部分;我假设所有指令都是由分支预测器预测的,以供取指令单元根据预测进行取。 另一位绅士试图帮助提到有关“分支指令”的内容,该指令也与预测指令一起发送。此“分支指令”测试分支预测器的预测是否正确的条件。我还假设这些分支指令进入分支执行单元,并且不需要从内存
..
出于学习目的,我编写了一个小汇编程序(test.asm): global _main extern _ExitProcess@4 section .text _main: mov ebx,0 push ebx call _ExitProcess@4 然后我用NASM(test.obj)组装了它: n
..
我似乎在NASM的文档中找不到任何关于在代码中使用Section或[Section](带括号)之间的区别的明确内容。我知道这些都是宏,但我看到它们几乎可以互换使用。真的是这样吗?换句话说,就是 [SECTION .text] 相当于 Section .text ? 方括号是否暗示了某种神秘的副作用? 谢谢 推荐答案 [SECTION .xyz]是SECT
..
我有一个适用于64位Linux系统的NASM程序,它可以在标准I/O设备上运行,它看起来是这样的: section .data prompt db "Enter your text: ", 10 length equ $ - prompt text times 255 db 0 textSize equ $ - text section
..
我遇到了这样一个任务,即为我用汇编语言制作的程序构建一个Makefile(没有什么新奇的东西,比如Hello World)。该程序是在Linux 32位,我使用的是NASM汇编语言。到目前为止,我只能找到C程序的Makefile,我知道它们之间没有太大区别,但我不熟悉这个东西。我所拥有的是: Program: main.o gcc -o Program main.o main.o:
..
我正试图在我的64位Ubuntu上编写我的第一个“Hello world”外壳代码,但它不能工作。 我有文件hello.asm: ; 64-bit "Hello World!" in Linux NASM global _start ; global entry point export for ld section .text _start: ;
..
我是汇编语言中的新手,我尝试创建函数并在C中使用它。这个函数得到3个变量a,x,y,它们是包含两个64位int的结构。我想返回a+x*y。不幸的是,这段代码是NASM导致段错误 %define a1 [rdi] %define a2 [rdi+8] %define x1 [rsi] %define x2 [rsi+8] %define y1 [rdx] %define y2 [rdx+8]
..
测试平台为32位Linux。 我使用 nasm -f elf final.s 汇编代码,并生成以下错误: final.s:40454: error: (at:1) `%$strucname': context stack is empty final.s:40454: error: (at:1) `%$strucstart': context stack is empty f
..
我有一个适用于x86_64的兼容Multiboot2的ELF文件,其中开始符号在start.asm中定义,这是一个NASM程序集文件。Multiboot2标头包含relocatable标记。 由于GRUB不支持Multiboot2+a可重定位ELF(至少在2021年7月[3]),我希望自己解决一些重定位问题以解决此问题,并只加载静态ELF。 为此,我需要在运行时在我的第一个条目符号(在EL
..
问题:movaps出现分段错误。 上下文:x86-64指令vmovaps旨在与Core I系列处理器(我正在运行此系统)上的AVX寄存器一起使用。AVX寄存器的宽度是SSE寄存器的两倍(分别为256位和128位)。指令vmovaps应将对齐的浮点值(32位)向量移入指定的ymm寄存器。 可能的原因:源数据的对齐特别重要,因为不正确对齐的数据是分段错误的来源。然而,即使我已经对齐了我的数
..
在64位x86汇编NASM中,如何将单个字节从寄存器移到.data部分定义的内存位置? 我知道这很管用 global _main section .data quotient db 0x0, 0x0, 0x30, 0xa ; 3 digit + newline remainder db 0x0, 0x0, 0x30, 0xa; 3 digit + newline section .
..
我正在构建一个简单的操作系统,并尝试从引导加载程序中获取屏幕上的一些文本。 每当我编译它(nasm -fbin bootloader.asm)时,都会出现以下错误: print.asm:23:错误:操作码和操作数的组合无效 我不明白出了什么问题,print.asm甚至没有那么多行,所以不清楚NASM不喜欢哪行。 这是bootloader.asm: [org 0x7c0
..
NASM手册谈到了这些宏,但就我所见,它并没有真正解释如何使用它们。Section 3.4.6状态: 浮点常量仅可作为DW、DD、DQ、DT和DO的参数,或作为特殊运算符__?float16?__、__?bfloat16?__、__?float32?__、__?float64?__、__?float80m?__、__?float80e?__、__?float128l?__的参数,和__?fl
..
我正在尝试从Bootloader编写引导加载程序。编写的代码是 BITS 16 start: mov ax, 07C0h ; Set up 4K stack space after this bootloader add ax, 288 ; (4096 + 512) / 16 bytes per paragraph mov ss, ax
..
所以我正在使用NASM为Linux开发一个x86汇编程序。这个程序基本上是要求用户输入他们的名字和他们最喜欢的颜色。在这样做并将两个字符串存储在.bss部分中声明的变量中之后,程序将打印“不可能用户名,最喜欢的颜色也是我最喜欢的颜色!” 我遇到的问题是输出中有很大的空格,因为我不知道用户输入的字符串有多长,只知道我声明的缓冲区的长度。 section .data greet:
..
正在尝试将正数除以负数。 目前我的程序将正确划分,并且我可以正确访问剩余部分。 但当我输入一个正数除以负值时,它根本不会被除法。 我知道有一种方法可以“标记扩展”,并且它将正确划分。我就是看不懂手册 Movsss$imm/%reg%reg/mem移动,符号扩展231 Movzss$imm/%reg%reg/mem移动,零扩展 当然这是ATT语法,我需要英特尔语法 以
..
我正在用汇编语言编写一个‘Hello World’程序。我声明了2个字符串常量,每个字符串的末尾都有换行符 : section .data str1: db "abcd " str2: db "efgh " section .text global _start _start: mov rax, 1 mov rdi, 1 mo
..
给定以下代码: L1 db "word", 0 mov al, [L1] mov eax, L1 [L1]中的括号表示什么? 这个问题是关于NASM的。英特尔语法汇编的另一个主要特点是MASM风格,当不涉及寄存器时,括号的工作方式不同: 请参见Confusing brackets in MASM32 推荐答案 [L1]
..