Assembly 把两个Org放在一起

我正在构建一个引导加载程序,引导位于软盘1000h部分的内容。我使用的是Fasm(因为我的朋友只使用Fasm,他正在帮助我),但我更喜欢使用,现在我在语法方面遇到了问题,我想知道如何在Nasm中做到这一点: org 7C00h %include "boot.asm" org 1000h %include "kernel.asm" PS:我已经使用Nasm语法样式将%include指令放在了Fasm上,它应该是include查看您的问题描述或我认为是什么,因为从这个问题中有点难

Assembly imul汇编指令-一个操作数?

我正在使用运行时调试器 EAX:0000 0023 EDX:555556 imul edx EAX:aaaa-aac2 EDX:0000 000b 我完全糊涂了,搞不懂这个乘法器是怎么工作的。这里发生了什么事?我注意到在一个类似的例子中,imulebx;结果导致EDX:EAX我不理解EDX:EAX符号,尽管:当imul的一个操作数形式被传递一个32位参数时(就像您使用EDX的情况一样),它实际上意味着EAX*EDX其中EAX和EDX都是32位寄存器 两个32位值的乘积不一定适合32位:完整乘法

Assembly Nasm中不同类型的引用

在nasm中使用单引号“或双引号”有什么区别?它对定义变量或嵌套引号有任何影响吗?来自: 一个字符串由多达个字符组成 其中包含八个字符 单引号(“…”),双引号 (“…”)或反引号(..)。单个 或双引号相当于 NASM(当然除了 用单数包围常数 引号允许出现双引号 在它内部,反之亦然) 它们的内容被表示出来 包含在 反引号支持C样式的转义 对于特殊字符 听起来并不愚蠢,但为什么是八个字符,如果你包含更多字符,比如在索引缓冲区中,会发生什么?实际上这取决于架构(最多),8个字符对64位体系结构有

Assembly 如何在gdb中的地址指定的指令上设置中断?

我怎样才能给那个指令设置一个断点呢。当我写的时候: break 9048f23 break *9048f23 它不起作用 我怎样才能给那个指令设置一个断点 9048f23: 8a 51 e6 mov 0x12(%esp),%eax 平台:Linux。您只需添加十六进制前缀: b *0x9048f23 默认情况下,您需要使用0x前缀来指定十六进制数(正如Igor所说;+1) 如果您希望十六进制通常用于数字输入(无需前缀),可以使用以下命令更改默认

Assembly 如何检查x86程序集中的密钥状态?

今年一月份,我把x86汇编作为一种业余爱好,这样我就可以在旧的8086驱动的计算机上制作游戏,比如PCj和Tandy 1000,但我发现的书并没有教多少关于这个特定主题的内容。虽然有些dos和bios中断可以完成这项工作,但它们还远远不够完美 我的主要问题是在不停止程序的情况下读取按键的键盘状态。我找到了一些方法,但它们非常有限。INT 21h,AH 0Ch读取最后按下的键,但以文本编辑方式。它不仅一次只能读取一个键,而且像记事本一样的点击检测使得它不可能知道这个键被握了多长时间。在我的谷歌旅行

Assembly 二进制炸弹第5阶段-查找表转换->;字符串比较

我一直在为学校设计一个双星炸弹,我完全迷失在第五阶段。任务的目标是分解代码并找到一个字符串,我发现它是“flyers”,并对其进行反向工程,使其具有与“flyers”相同的数值。然而,我已经花了3-4个小时试图找出如何做到这一点?你不必给出答案,但请帮助我理解我需要做什么。以下是使用gdb反汇编的代码: Dump of assembler code for function phase_5: 0x08048d88 <+0>: push %ebx 0x08048d89 <

Assembly ARM减法指令的第四个参数

是否有人可以向我解释/确认这一点(尤其是子行): 我在想它可能与c代码相当: if ((align==2) || (align==5) || (align==8)) { xpos -= width >> 1; } 我找到了这个,但我不理解第四个参数,imm12。它只是说: SUB指令从Rn中的值减去操作数2或imm12的值 我觉得你对代码功能的假设是正确的 但我不明白第四个参数,imm12 第四个参数不是imm12,而是width(我假设它是一个通用寄存器的别名)。谢谢,是的a

Assembly 为什么我们不能将寄存器(bne-beq)与立即程序集(MIPS)进行比较?

例如,在add上,我们有addi用于添加寄存器和立即数,为什么在这种情况下,我们不能有bnei或beqi 我应该回答这个问题,但我不确定……有什么帮助吗 在具有标志的体系结构中,分支指令通常遵循一条比较指令,该指令可以比较寄存器和立即数并设置适当的标志(通常称为CMP,但通常其他指令也可以设置标志)。然后分支只检查标志 (这是在向MIPS澄清问题之前发布的,MIPS不使用标志)原因是指令编码: ADDI和BNE/BEQ都是。但是,ADDI指令中的立即数字段用于存储加法的立即数操作数,而在BEQ/

Assembly 如何在MIPS程序集中执行递归操作?

我的任务是编写递归MIPS汇编程序,在function1中执行以下数学运算: (-3)*function1(n-2) + 7*function1(n-3) + 15 程序采用c语言建模: // The function1 is a recursive procedure defined by: // function1(n) = 1 if n <= 2 // = (-3)*function1(n-2) + 7*function1(n-3) + 15 otherwise. int fun

Assembly 在程序集中按值传递字符串而不知道它';s码

所以我在实现C编译器的子集,有一个特性让我头疼。所以我想知道如何解决这个问题 在我的节目里。语言是所有通过值传递的参数,包括字符串,其声明如下: string str; string str; int number; str = something; 我的问题是,正如您所看到的,在声明过程中我不知道字符串的大小(与C不同),所以当我生成程序集时,我不知道在堆栈上为它创建多大的空间。 如果我有这样的代码: string str; string str; int number; str = s

Assembly 将存储在EDX:EAX中的64位数字打印到标准输出

我在EDX:EAX中存储了大的64位数字,分别为21C3677C:82B40000。我正试图将数字以十进制2432902008176640000打印到控制台。是否有系统调用允许我完成此操作?哪个操作系统?在linux上,您使用write系统调用。这是通过您正在使用的语言的标准库来完成的。您必须自己完成从二进制ASCII字符到十进制ASCII字符的转换,然后将write系统调用指向该ASCII文本,给出其长度,并告诉它要写入哪个文件描述符,stdout将是文件描述符1 这里有一种方法可以找出Lin

Assembly 如何在汇编语言中计算给定文本(字符串)中出现的字母?

我正在构建一个程序,它将计算给定文本中每个字母出现的时间。例如,如果文本为“Hello World”,则输出如下: H-1时间 e-1时间 l-3次 o-2次 W-1次 r-1时间 d-1次 问题是我们必须区分大小写。 我从谷歌那里得到了一段代码,但我并不真正理解其中的一部分。我对代码进行了注释,说明我知道它的功能。谁能给我解释一下吗?多谢各位 buffer BYTE "AAbcd", 0 charInput BYTE 26 DUP(0) ; should the array siz

Assembly 通过长度或其他方式查找操作码

给定一个字节序列x86指令到一个随机字节流中,是否有可能对它们的指令进行解码 操作码是固定长度的还是有办法检测这些指令 给定一个字节序列x86指令到一个随机字节流中,是否有可能对它们的指令进行解码 对。许多种类的处理器都能做到这一点。这是他们最容易完成的任务之一 是固定长度的操作码 没有 或者有没有办法检测这些指令 指令的第一个字节允许推断其长度。您会发现。可变的指令长度使您很难知道是否从正确的字节开始反汇编。@DCoder(在阅读您的bio之后)实际上,我原以为你从地址A开始反汇编,是因为你遇

Assembly SPIM中的刻度i

我有这个Spim代码,还有一个比例I, 这是什么意思 .Data a: .word -2,35,-8,12-3,-62,-41 n: .word 7 endl: .asciiz "\n" .text main: li $t0, 0 #i li $t1, 0 #Npos li $t1, 0 #Nneg lw $s0, n

Assembly 理解“堆栈”

因此,当我们提到堆栈顶部时,请记住它位于堆栈内存的底部 我正在阅读一本关于x86 ASM的教程,它有这样一个功能。我真的无法理解这有什么该死的意义。我假设它与一些硬件级别的事情有关,而到目前为止,我对硬件一无所知 有人能解释一下吗?一个图表将非常有用,但也许只是解释为什么堆栈的顶部意味着堆栈的底部我肯定不会选择x86作为您的第一种汇编语言……但它们几乎都有一个堆栈 想象一下一堆便笺卡,每个便笺卡上只能写一张便笺。比如说一张杂货清单,一张是鸡蛋,另一张是牛奶,另一张是面包。你可以去看看上面的那张,

Assembly 汇编编程

我是汇编编程新手。现在我正试图编写一个将数字从十进制转换为二进制的程序,但我遇到了一个问题。在用户输入从0到65535的数字后,我必须将其从ascii字符转换为ascii整数,然后才能开始从十进制转换为二进制。如果它是一个从0到9的数字,我想我可以很容易地写下: SUB ax, 48 但这只需要输入一个数字就行了。。。 若数字更高,如何将键入的数字转换为ascii整数?我曾想过将字符串分隔成字符,但我不知道如何才能做到这一点 这是我已经编写的程序的一部分: .MODEL sm

Assembly 如何使用条件数据传输创建函数?

我的代码如下: 智力智力测验(智力*xp) { 返回(xp?*xp:0); } 使用gcc,我可以在没有条件数据传输的情况下获得汇编代码,我知道这是因为它可能尝试从空地址读取。那么,如何通过修改原始代码,使用条件数据传输获得汇编代码?消除取消引用空指针的可能性。取消引用之前,请确保指针有效。例如: int-cread(int*xp) { 静态常数int=0; 返回*(xp?xp:&零); } 我的编译器生成以下代码(其他代码可能有所不同): movl4(%esp),%eax movl$0.17

Assembly 什么是“和esp,0xFFFFF0”?

当我在gdb中反汇编一个main()时,它会重新运行这个结果: 0x0804854c <+0>: push ebp 0x0804854d <+1>: mov ebp,esp 0x0804854f <+3>: and esp,0xfffffff0 0x08048552 <+6>: sub esp,0x10 它使得: 0xbffffb70: 0xb7ea1515 0xb7ff0590 0x080485

Assembly 仅为LLVM发出跳远指令,而不是跳短指令

有没有简单的方法使LLVM不发出带有1字节位移的跳转指令,比如 75 30 JNE+30,eb 1a JMP+1a等; 相反,只发出带有3字节零填充的4字节移位跳转指令,如 0f 85 30 00 00 JNE+30,e9 1a 00 00 JMPQ+1a等。, 在x86_64体系结构下 显然,这会增加代码大小。在x86asbackend.cpp中有一个函数fixupneedsreasion。如果您始终在此处返回true,则应始终放松,例如更改为完全置换。在X86AsmBackend.cpp中有

Assembly 检查数字是奇数还是偶数(数学奇偶性)

对于一位数,我想知道它是奇数还是偶数(2的倍数)。例如,给定9,则打印为奇数 (即检查,而不是计算。) 这就是我所拥有的: assume cs:cseg,ds:dseg,ss:sseg cseg segment start: mov ax, dseg mov ds, ax mov ah, 01h ; Here, im adding a number int 21h jp even

Assembly 集合游戏角色移动减慢我的游戏速度

我正在组装一个游戏,游戏是一个角色对象,在这种情况下,是“X”字符移动以躲避下降0和1。我的坠落物是完美的。我唯一的问题是,如果有人按住左或右的方向,我的坠落物就会停止,以适应玩家物体的新位置。我正在使用irvine库来处理程序,比如readkey,它可以获得键盘输入,其他的几乎都是100%的我。我不知道为什么它会停止一切来完成一行只在打印周期的第一次执行的代码。任何帮助都将不胜感激。下面我将发布代码。因为现在它运行在一个无限循环上,如果你被一个物体击中,这个循环就会被打破 ;*******

Assembly 汇编:将十六进制转换为十进制

我尝试获取用户输入的十六进制数字0-9或a-F,并将结果输出为十进制,如果用户输入的内容超出十六进制范围,则显示错误消息,并根据用户的选择重复整个过程 当试图通过NASM编译时,程序会警告无法打开该文件。我的代码是否存在导致此错误的错误 最终,我尝试在DOS框中运行这个程序,并在NASM中成功编译 *编辑:该代码已自更新,但如果输入了非十六进制值,并且继续、检查退出和退出功能未正常工作/未显示为用户输入的结果,则会导致infinte循环 代码如下: ;this program takes inp

Assembly 素数程序错误(MASM)

在这个程序中有一个小错误。这是一个简单的程序,允许用户输入一个大于2的数字,并确定它是否为素数。除了3和4之外,它工作正常。3不是质数,4是质数。我只是展示了计算的代码 ;ecx = divisor, esi = max divisor, edx = remainder, eax = quotient mov ebx, eax shr eax, 1 mov esi, eax ;Max divisor value mov ecx, 1 isPrime: inc ecx

Assembly 汇编printf中的分段错误

我试图编写一个汇编函数,将汇编中一个字符串的一部分复制到另一个字符串(用于类赋值)。它的一部分是检查要复制的索引是否合法(在字符串的范围内),如果不合法,则打印一条简短的错误消息并在不更改任何内容的情况下退出。该函数对于非错误输入工作正常,但当我专门输入错误的参数(例如在长度为15的字符串中复制索引10-20)时,它会在printf中的某个地方出现故障 我正在使用AT&T X86汇编 这可能是什么原因造成的 代码: pstrijcpy: 按%ebp#保存旧FP 移动%esp,%ebp#设置新FP

Assembly 组装炸弹实验室第四阶段 0x00000000004010e4:sub$0x18,%rsp rsp=-24 0x00000000004010e8:lea 0x8(%rsp),%rcx rcx=76 0x00000000004010ed:lea 0xc(%rs

组装炸弹实验室第四阶段 0x00000000004010e4:sub$0x18,%rsp rsp=-24 0x00000000004010e8:lea 0x8(%rsp),%rcx rcx=76 0x00000000004010ed:lea 0xc(%rsp),%rdx rdx=0 0x00000000004010f2:mov$0x40298d,%esi esi=37输入为%d%d 0x00000000004010f7:mov$0x0,%eax eax=0 0x00000000004010fc:

Assembly MARIE中带重复加法的立方数

我正在尝试为MARIE编写一个子程序,它将使用重复加法对数字进行立方运算。我知道我需要把数字加起来等于它的数量的三倍(所以如果是4,我需要把4加上4倍,3倍)。我没有一个真正的好主意如何循环3次以上。也不确定如何使用JnS 从我看到的示例中,它们使用JN存储值。这是我的 /Subroutine for finding cube of number / Load Num /Load the first number Store Count /Store this number

Assembly 雷普·雷特:为什么这么麻烦?

这里[]以及其他来源[,]对repz-ret的问题进行了令人满意的讨论。然而,通过阅读这两个来源,我发现了以下问题的答案: 与ret或nop进行定量比较时,实际惩罚是什么;ret?特别是在后一种情况下——当大多数函数要么有100多条指令,要么内联时,解码一条额外的指令(以及一条空指令!)真的相关吗 为什么AMD K8从来没有修复过这个问题,甚至没有进入K10?因为当原因的每一个细节都已知时,记录一个丑陋的解决方法是基于一个没有记录的行为,而不是实际解决问题 分支预测失误 所有这些喧嚣的原因是分支

Assembly 程序正常崩溃,但不使用Valgrind

我试图调试一段汇编程序(x86 64位),根据gdb信息,它在使用以下指令时崩溃: xorpd 0x1770(%rip),%xmm12 # 0x40337c <S_0x403230> 另一件有关联的事情是,每当我在命令行以及gdb中运行这段代码时,它都会崩溃。但是,当我在valgrind中调试它时,它不会崩溃 ☁ src [master] ⚡ valgrind ./a.out 20 reference.dat 0 1 100_100_130_cf_a.of ==1

Assembly rh850组装中的分割指令时间

我用的是rh850控制器 它具有除法DIVQ的操作,执行此操作的时间定义为N+7,其中 N=(股息绝对值的有效位数)–(股息绝对值的有效位数) 除数) 我不知道“绝对值的有效位数”是什么意思。我在互联网上查了一下,发现“有效位数(ENOB)是衡量模数转换器(ADC)及其相关电路动态范围的一个指标。”我目前不使用ADC。有人能告诉我怎么计算吗。它大概意味着数字真正需要多少位,而不是存储在多少位上。或者,换句话说,最高位集的1基位置。我也这么想,但我不确定

Assembly “什么是”呢=&引用;在AT&;汇编语言?

我正在尝试编写引导程序。内容如下: .text balabala .globl _start _start: balabala .=_start+510 .byte 0x55,0xaa 顺便说一下,我也不明白“.字节0x55,0xaa”的意思是什么? 它的功能是什么?它是如何工作的? 细节越多越好。汇编程序将数据和指令转换为字节。与编译器不同,汇编指令和内存之间通常有1:1的匹配。这个传统上,符号用于表示从当前程序段开始的当前偏移量 它最常用于确定对象的大小 使用已修改的示例: SOMEDA

Assembly 键盘上的LED灯-部件

如何使用assembly打开/关闭键盘中的灯? 我已经试过了 Mov Al, oedh Out 60h, Al Mov Al, 111b Out 60h, Al 但它不起作用 我正在使用DosBox运行asm文件DosBox可能没有模拟键盘上的灯光,因为它不是游戏使用的东西。好的,谢谢。如果没有dosbox,我如何运行8086个asm文件?您可以尝试在VM中安装MS-DOS,如VirtualBox。

Assembly 在8086汇编程序中求图的位置

有没有办法在8086汇编程序中获得图片的位置? (在图形模式下) 背景: 我想做的是一个游戏,箭头围绕图片(玩家)旋转,当用户按下空格键时,图片移动(与箭头指向的方向相同),当用户再次进入空格时,图片将停止,以此类推 但是我被卡住了。我不知道在图片从初始位置移动后如何绘制箭头 谢谢 有没有办法在8086汇编程序中获得图片的位置?(在图形模式下) 当然,只需读取记录图片位置的相关变量 PositionX dw 0 PositionY dw 0 您还需要跟踪箭头的位置(当然您已经这样做了!): 它

Assembly 装配后的任何优化说明

Nvidia编译器在SASS后是否进行了任何优化?更准确地说,如果我编辑SASS代码来执行某些操作,我可以保证它们会像在SASS文件中一样在设备上运行,或者编译器也有可能优化这些指令(在SASS文件中) 蒂亚 我找到了答案。不,这是不可能的。SASS是在GPU上运行的最终版本

Assembly mips错误立即值(2147483647)超出范围(0..65535)

嗨,这一行代码让我特别难受安迪$13,$12,0x800。该计划的其余部分似乎运作良好。其中,我使用sll$12,$12,1移位以获取位的其余部分。但由于某些原因,我在整数值中错误计算了0的数量。哦,是的,这个程序的目的是计算整数中前导0的个数,然后打印出0的个数 andi $13, $12, 0x8000 bne $13, $0, endp addi $10, $10, 1 sll $12, $12, 1 b pos 你知道为什么0

Assembly 如何知道汇编指令被命中的次数

我目前正在做一个项目,在这个项目中我在汇编级别修改了一些程序。程序转换非常简单,我只是在代码中的特定位置插入一些屏蔽操作 我想知道我的屏蔽指令执行了多少次,以便准确了解程序转换成本 目前我使用的是GDB,我在屏蔽指令所在的位置设置了硬件断点。之后,我可以使用info断点获得断点的命中计数 然而,GDB是超慢的,对于通常需要10秒以下的程序,即使经过一夜的计算,它也不会完成 我很确定我使用的是硬件断点,我总是设置少于4个(我在一个有4个调试寄存器的英特尔处理器上运行) 我的GDB版本是8.0 我正

Assembly 十进制到八进制和十六进制的转换(同时输出)-汇编

我有一个汇编程序,它应该接受十进制并将其转换为八进制和十六进制。目前,它可以同时转换这两种格式,但会提示用户输入所需的值以进行两次转换。。我应该只提示用户一次,然后打印两个输出。我希望将输入值保存在一个变量中,并将其传递给两个转换函数 这是我以前的代码: .model small .stack .data CR equ 13 lf equ 10 Introduction db cr,lf,09H,">TEST<$" Students db cr,lf,

Assembly 什么是AMD ryzen 7 2700指令集(用于创建汇编程序)

我想创建我的第一个汇编程序,这样我就可以编写我自己的程序语言,我自己的操作系统等等。只有一个问题: 我找不到ryzen 7 2700的指令集。我已经发现它使用了zen+架构,但我也找不到适合它的东西。有人知道我在哪里可以找到一个完整的指令集,包括CPU能够执行的所有操作和所有寄存器名等等吗?这真的很有帮助 顺便问一下:你知道我要学习的汇编程序的开源代码吗?我对这个话题还不熟悉,所以我首先要学习很多,我认为这是一个学习汇编程序编码的机会。我也会感谢有更多的东西可以阅读,还有其他我可以从中学到的东西

Assembly LDR指令-CortexM7上的未对齐使用故障

我正在调试为CortexM7目标编写的汇编代码。busFault处理程序中有一条LDR指令,执行该指令时会导致未对齐的使用故障,并因此发生强制硬故障。我所知道的是,默认情况下,ldr指令没有地址对齐要求。 我还检查了CCR寄存器中的位,它可以强制执行该要求,但已禁用。 以下是我的代码: global c_AbcFunction c_Abc .long c_AbcFunction BusFaultHandler: LDR R1, c_Abc 编译器:A

Assembly OS在比较字符串上暂停

我正在尝试创建一个操作系统,我不知道汇编语言的每一个输入和输出,我主要是边学边用。问题是,我构建了一个简单的函数来比较两个字符串(eax和ebx),问题是当我运行代码来执行此操作时,我的系统在调用后不会执行任何操作。。。我做错了什么 compare: xor ecx, ecx .by_char: mov dh, [eax+ecx] mov dl, [ebx+ecx] cmp dh, dl inc ecx

Assembly MIPS load word left(LWL)和load word right(LWR)指令的作用是什么?

我最近在阅读MIPS指令集时,遇到了两条在其他指令集中从未见过的异常指令 我环顾四周,想找到一个像样的解释来解释这些指令到底是做什么的,但我能弄清楚的是,它们与未对齐的内存访问有关 例如: MIPS I要求所有内存访问与其自然字边界对齐,否则会发出异常信号。为了支持高效的未对齐内存访问,有后缀为“left”或“right”的加载/存储字指令 但没有进一步阐述这实际上意味着什么 我能找到的最接近正确解释的是: 通过使用一对特殊指令,可以在两条指令中加载或存储未对齐的字和双字。对于加载,LWL指令与

Assembly 如何修复32位汇编中的sum_数组函数

我试着在堆栈的帮助下对汇编中的数组求和,但结果是不可接受的 当时我试图通过打印ecx寄存器的结果来调试代码。我还尝试使用gdb进行调试,但我不知道如何打印esp或ebp指出的堆栈 .extern printf .extern exit .extern scanf .extern read hex: .asciz "%x" hexn: .asciz "%x\n" intn: .asciz "%d\n" strn: .asciz "%s\n" charn: .a

Assembly `操作数类型不正确:MASM 5.00的数据错误'

我在将文件从EMU8086汇编语法转换为MASM 5.00语法时遇到问题,出现错误: 操作数类型不正确:数据 我的代码是: .model small .stack 100h .data x db ? y db ? z db ? q db 10,13, 'First Digit $' r db 10,13, 'Second Digit $' s db 10,13, 'Product $' .code mov ax,data mov DS,ax lea dx,q mov ah,9 int

Assembly 在gdb中执行指令/命令

看起来有一种方法可以通过将C代码注入gdb 有没有办法在命令行中注入一条指令?例如,类似于: >>> mov %rax, %rbx # Undefined command: "mov". Try "help". 据我所知,这不是一种简单的互动方式;我认为GDB的命令解析器中没有内置汇编程序,只有从内存中反汇编代码的命令。理论上可能是某种外部装配+某个地方的负载 当然,您可以设置$rbx=$rax来复制特定mov的效果 GDB使用$作为

Assembly 如何使用防锈剂';s-x86从指令字符串生成操作码

我是个新手,当时我正在乱搞ice库来分解东西,它非常有用 我似乎不明白的是如何使用编码器从字符串而不是指令结构生成操作码 据我所知,iced-x86文档并未涵盖这一点 根据文档:编码器可用于在任何地址对解码指令进行重新编码-未提及对字符串中的指令进行编码 这就是我基本上想要实现的目标: use iced_x86::*; let instr = "xchg ah,[rdx+rsi+16h]"; let mut encoder = Encoder::new(64); matc

Assembly 在汇编中做某事与让汇编人员做某事

以下两种方法中哪一种更适合获得2^n-1?为什么一个比另一个更受欢迎 # (2a) -- instructions mov $1, %eax shl $X, %eax dec %eax # (2b) -- assembler mov $((1 << X) - 1), %eax 我个人觉得第一个更可读,但我很确定可读性不是asm的重点。总是在每次构建时在汇编时尽可能多地执行一次,而不是在运行时,因为在运行时它会消耗代码大小,并且每次执行此块都会消耗时间 它们都以相同的mov$imm

Assembly I';我正在尝试创建一个引导加载程序,其中圣诞树由星号组成,但我可以';我不知道如何使用相同的循环打印

我想得到这样的东西 * *** ***** ******* ********* *** *** 我已经学会了如何创建一个循环,并尝试调整相同的代码以多次使用循环,但失败了。下面是到目前为止我编写的代码 [BITS 16] [ORG 0x7C00] top: ;; Put 0 into ds (data segment) ;; Can't do it directly mov ax,0x0000 mov ds,ax

Assembly 初学者-Rop链-选择的小工具

我正在尝试执行Rop链,该链将我的id写入堆栈中的指定地址(0xdeadbeef0000)。 我得到了一个编译过的文件,然后我得到了一个包含该文件所有小工具的输出文件。 我不确定我从小工具中选择的装配线的逻辑。 目标是显示堆栈的内存映像。 内存映像: 0xffffffffffffe5e0 : 0x00000000000011da // pop rbx ; ret 0xffffffffffffe5e8 : 0xffffffffffffe610 0xffffffffffffe5f0 : 0x0000