Assembly 何时需要.type、.thumb、.size和.section指令?

我正在为基于ARM Cortex-M3的微控制器(Thumb 2指令集)编写一个汇编程序,使用GNU作为 在一些示例代码中,我发现像.size、.section和.type这样的指令是ELF指令。例如: .section .text.Reset_Handler .weak Reset_Handler .type Reset_Handler, %function Reset_Handler: bl main b

Assembly 检查程序集中字符串的第二个字符

我在用MASM 我想检查汇编中字符串的第二个(和第三个)字符 我试过这个: ; String is in DWORD operandA mov eax, OFFSET operandA+1 cmp eax, '!' je Fact 这不管用。有什么建议吗?您需要取消对指针的引用以获取实际字符: mov eax, OFFSET operandA+1 mov cl,byte ptr [eax] cmp cl,'!' 或 这将保留eax,以便您可以使用以下方法比较第二个字符: inc eax mo

Assembly 在64位ubuntu上使用哪个动态链接器

我有一个简单的汇编语言程序,可以输出hello world。它通过动态链接到glibc使用printf和exit函数 如果我使用此版本的链接器: ld -dynamic-linker /lib64/ld-linux.so.2 -o helloworld-lib helloworld-lib.o -lc 然后,当我执行可执行文件时,我得到了这个错误: bash:./helloworld库:访问损坏的共享库 如果我改为使用: ld -dynamic-linker /lib64/ld-linux-x

Assembly 将uint32的向量转换为浮点向量的最有效方法?

x86没有SSE指令将无符号int32转换为浮点。实现这一点最有效的指令序列是什么 编辑: 为了澄清,我想执行以下标量操作的向量序列: unsigned int x = ... float res = (float)x; EDIT2:这是一个简单的标量转换算法 unsigned int x = ... float bias = 0.f; if (x > 0x7fffffff) { bias = (float)0x80000000; x -= 0x80000000; } r

Assembly INSTR 0x0(REG),REG,0x0位移是什么意思?

我查看了一些编译器生成的汇编代码(x86_64),发现很少有零位移的指令,如下所示 movzbl 0x0(%rbp),%eax 这种0x0位移背后的原因是什么?(我是汇编新手,如果已经讨论过这个问题,请给我指出链接。)据我所知,上述说明将零扩展rbp+(0x0)复制到eax 编辑:我找到了一个链接,解释了leal 谢谢你 它的意思是movzx-eax,字节[rbp+0] (e | r)bp中包含的地址处的内存操作数没有编码,但(e | r)bp+常量有编码。因此,在rbp中,该常

Assembly x86/x64添加位移寻址

我正在为x86/x64 CPU指令编写编译器,但我似乎不明白人们所说的“置换”地址是什么意思。例如,此处详细介绍了Add指令: 我只是想实现add指令,将寄存器添加到普通内存地址。问题是,地址是一个“置换地址”。这是否意味着地址是一个有符号的值,即与指令位置的偏移量?没有“带位移的特殊加法”,该页正在不必要地混淆-这只是正常内存操作数编码的一部分 add是一条相当标准的指令,其编码方式与所有alu操作相同:使用al作为目标和立即数作为源(04 ib),使用ax/eax/rax作为目标和立即数作

Assembly 正在查找将ASM指令显示为二进制代码的程序

我正在寻找一个程序(Linux/FOSS首选)或一个网站,可以快速方便地向我展示(英特尔)汇编指令的十六进制等价物 例如,我输入: test al, al 它输出 84 c0 用C编写内联程序集并检查它编译成什么并不那么快速和方便。我总是使用as from binutils来实现这一点。例如: $ echo -e "MOV DWORD PTR [RSP+4], 0x12345678" | as -o /dev/null -64 -al -msyntax=intel -mnaked-reg G

Assembly 为什么我的程序提前退出循环?

我的程序应该包含两个整数和一个运算符(除法、乘法、加法、减法)。从那里,它计算答案和余数(如果需要) 之后,如果用户想要进行另一次计算,则应使用(y/n)选项提示用户。如果是,它将重新循环,如果不是,程序将退出。出于某种原因,它不允许我为(y/n)输入选项,只是跳过输入,直接进入终止。这是我的密码。(对不起,初学者) 在输入操作员之前,我还得到一个“未知错误代码45”(弹出窗口?) # SPIM Calculator # Computer Organization .data prom

Assembly Atmel运行解决方案-未能启动。缺少文件:AssemblerApplication1.obj

对于学校任务,我必须在Atmel Studio 6.0中编写一个简单的汇编应用程序。它可以毫无问题地构建,但当我尝试运行它时,它返回以下错误: 14:46:11:[错误]无法启动。缺少文件:C:\Users\Administrator\Documents\Atmel Studio\AssemblerApplication1\AssemblerApplication1\Debug\AssemblerApplication1.obj 我没有任何组装经验,也找不到任何人在同一问题上挣扎

Assembly Raspberry Pi在ARM组件中编程时出现分段错误

你好。我正在尝试用ARM汇编语言为我的Raspberry Pi创建一个程序,它将4x4矩阵和4x1向量相乘。我目前的问题是,我得到了分段错误,当我运行调试程序时,错误似乎发生在\u vectoradress 根据我从谷歌上收集到的信息,分割错误的可能原因是我试图访问一个不存在的内存地址,或者程序试图访问一些它无法访问的内存。然而,我不明白我的情况如何 如果有人能告诉我我做错了什么导致了分割错误,那就太棒了 我的代码: 文件1: .section .data .align 2

Assembly ldr是否可以在ldrex之前重新排序到同一地址?

按照以下指令顺序: mov r4, r0 add r0, r4, #40 .tryagain: ldrex r1, [r0] add r1, r1, #1 strex r2, r1, [r0] cmp r2, #0 bne .tryagain ldr r1, [r4, #40] 我们首先将[r4+40]处的值原子地增加1。ldrex将旧值保留在r1中。 然后,我们立即使用普通加载ldr在同一地址加载新的递增值。 忽略一个明显的事实,即我们可以在bne之后向r1添加1,而不是再次加载它,

Assembly 汇编-堆对齐-x86英特尔

我想我理解了4字节的堆栈对齐,例如,如果我只添加一个字符,他的地址将位于4字节的右侧(如果有其他1或2字节变量,则稍早) 我仍然无法理解堆中的对齐方式,我认为有4字节或8字节对齐方式,但问题是,当我分配100到20字节时,在第一个字节的末尾和第二个字节的开头之间有4个字节,所以我猜堆将使用8字节对齐方式 通过连续分配1 4 7 8 9 14 16 17字节,我注意到1、4、7、8、9每个占用16字节,14 16 17占用24字节,这是为什么 我使用C/C++和malloc进行分配(new也是这样

Assembly 汇编-操作码与nasm指令

所以我最近试着进入大会,发现自己真的对NASM的工作方式感到困惑。据我所知,它是一种用于将(助记符)指令转换为实际机器代码的汇编的“编译器”。现在我想知道NASM手册(www.NASM.us/doc/nasmdocb.html)中列出的说明和我的机器使用的操作码之间的区别是什么?比如,让我们假设我的英特尔处理器有某种没有人知道、也没有在手册中列出的秘密操作码,NASM还能组装它吗?还是只返回“无效指令”?如果我知道操作码的机器码格式,我能手动插入吗?NASM支持NASM支持的功能 确实可能存在“

Assembly 如何在组件中的某个位置将字符串插入到其他字符串中? 对于我的作业,我尝试写插入函数,如C++插入。 我的函数应该在某个位置将一个字符串插入另一个字符串

输入: destination : Be my friend today source : good position : 6 输出: Be my good friend today 我该如何在琴弦中间腾出空间? 这是到目前为止我的代码 Insert PROC PROC uses edi esi ebx ecx, destination:DWORD , source:DWORD,

Assembly 我什么时候可以不使用";ptr";关键词?

到目前为止,当在x86内联程序集中按名称对变量或参数进行寻址时,我编写了dword ptr[varname]。 最近我看到一段代码,它只是使用[varname]作为操作数来寻址变量 那么何时我必须在大括号之前使用dword ptr,何时不使用? 如果我不需要它,它是可选的还是语义上的不同?当汇编程序可以在没有它的情况下推断内存操作数的大小时。类似于C转换-指定所需的操作数大小,以防止从不同大小的内存操作数加载寄存器时出现汇编程序错误。从概念上讲,这是因为它转换了varname指向DWORD的指针

Assembly 简单MIPS程序集-返回斐波那契数

我试图创建一个简单的汇编代码,它接受输入N并返回第N个斐波那契数(例如,如果输入2,它应该输出1,如果输入3,它应该输出2)。我的代码不会抛出任何错误,但在输入一个数字后,它会返回一些奇怪的结果 如果输入1,则返回2685009921。 如果输入2,则返回0.01。 如果输入3,则返回0.02。 如果输入4,它将在开始时输出文本,要求输入一个正整数,然后输入3(正确答案)。 如果您输入5,它将不输出任何内容,当您再次按enter键时,它将给出一个运行时异常(无效的整数输入syscall 5)。

Assembly 为什么旋转槽的第一个和第二个图像永远不会相同?

我有一个项目在汇编,我已经写了,它是一个旋转插槽与3图片选项。我不知道为什么我坐了好几个小时,找不到为什么第一个和第二个图像槽不可能是相同的,这就是为什么赢的条件永远无法实现 代码如下: IDEAL MODEL small STACK 100h DATASEG ; -------------------------- ; your variables here ; name of image file va db 1,2,3,4 filename db 'pic2.

Assembly 如何声明数据向量

我正在用ArmV8编写一个汇编程序,该程序使用多个常量(以浮点形式)乘以某个值(也以浮点形式)。为此,我想开发一个循环,它只是破坏了一个包含常量的向量,每次递增地址以访问下一个常量,乘以它,以此类推,而不是一次又一次地重复相同的操作。 尽管如此,我不知道如何在汇编程序中直接声明这个向量 在ArmV7中,我这样做是为了达到这个目的: Aux DCD 0x7F800000, 0x007FFFFF, 0x7FFFFFFF 但这只适用于ArmV7中的单词,我在使用ArmV8中的

Assembly 从MOV指令更改为添加或子指令

我想从mov指令更改为子指令(我想,我们也可以更改为添加指令),我想调整值,使整个程序的功能保持不变 for_real_programmers: mov dx, 0 ; inc dx ; for_leet_hackorz: mov word ptr [for_real_programmers], 0d929h ; ? mov word ptr [for_real_programmers+2], 0d9f7h ; ? mov byt

Assembly &引用;错误A2006:未定义的符号;在窗口7的masm32中64位?

当我运行这个示例时,我得到一个错误。删除PROC1 PROC FAR后,我收到另一个错误“符号类型冲突”。带/coff:“起始地址:start需要前导下划线” 微软(R)宏汇编程序版本6.14.8444版权所有(C)微软公司1981-1997。版权所有 汇编:D:\Linux\test1.asm D:\Linux\test1.asm(28):错误A2006:未定义符号:开始 D:\Linux\test1.asm(16):错误A2004:符号类型冲突 D:\Linux\test1.asm(28):

Assembly 在ARM中设置寄存器的一位最有效的方法是什么?

我正在编写ARM汇编代码,在某个时候必须将寄存器的一个位设置为1。当然,这最好通过“寄存器-或-bitmask”方法来实现。但是,根据ARM文档,汇编ORR命令(按位或)不采用立即值。换句话说,只能按位或一个寄存器中的值与另一个寄存器中的值进行比较。仔细想想,这是有道理的,因为ARM指令本身是32位长的,所以无法将32位掩码塞进指令中。然而,将立即数写入寄存器只是为了正确地使用它是低效的,因为它会产生一种会使CPU停止的危险。一般来说,在不浪费寄存器的情况下,用掩码或将寄存器保存在内存中最有效的

Assembly 两个字节的汇编十六进制表示法

我想输入一个类似415A6B31的字符串,汇编函数应该返回AZk1 所以我必须把每两个字节转换成一个字节。。。 41=A 5A=z,依此类推 如何在汇编中实现它?查看您正在处理的数字。字符串是十六进制的是吗?查找十六进制值0-9是0x30到0x39,使用0xF得到0-9是吗?但是,将0x41与0xF进行anding不会产生0xA,因此对于字符串中的每个字节 if(byte>0x39) byte = byte - 7; byte=byte&0xF; 这将为您提供半字节(nybles

Assembly MIPS程序集中出现语法错误

我在汇编文件方面遇到了一个奇怪的问题。每次我把这个文件加载到PCSpim中,第23行就会出现语法错误。我看了好几封推荐信,向几位同学求助,似乎没有人明白出了什么问题 .globl main .data test1: .word 92 test2: .word 81 finalExam: .word 90 a: .ascii "Enter value A:\n" b: .ascii "Enter value B:\n" grade: .wo

Assembly 为什么MASM会在组装时崩溃?

我正在为课堂做一个项目,教授希望我们使用MASM而不是任何其他汇编程序。(我知道这很愚蠢,跟他说,不要跟我说。)当我运行ML.exe编译代码时,它崩溃了。不是我正在写的程序,而是汇编程序本身。可能是什么原因造成的?它在运行之前运行了很长时间,所以它可能是某种无限循环 这是我的密码: .386 .MODEL FLAT PUBLIC compute_b_proc points EQU [ebp + 16] bs EQU [ebp +

Assembly 使用+的间接寻址;和[]

我对asm有点陌生。查看C为TI的C28x CPU生成的asm,并获得指令 MOVL *+XAR4[0],ACC 我知道这是一条长操作数移动指令,它接受累加器中的值,并将其放入由…指向的位置。。。。什么 XAR4是辅助寄存器4,但“+”和“[0]”的作用是什么?它们会占用额外的周期吗?来自“TMS320C28x DSP CPU和指令集”第5.6节“间接寻址模式” 参考指南“: 因此,它将把ACC存储在XAR4指向的内存位置(具体来说是XAR4+0) 当3位偏移量为0时,可以忽略它: The a

Assembly LLVM汇编语言的稳定性如何?

声明它可以被使用 作为磁盘上的位代码表示(适用于即时编译器的快速加载) 这种代表性有多稳定?例如,我现在是否可以使用LLVM 3.1生成它,并且仍然可以使用未来的LLVM(比如假设的LLVM 4.5)在三年内使用它 假设我没有外部依赖项,我可以使用它为不同的体系结构生成二进制文件吗?回答第一个问题:不,它不稳定。不,您不能期望3.1生成的IR/位代码在4.5中是可读的-LLVM项目明确没有做出这一保证,牺牲了向后兼容性,以便能够更快地向前推进,创建更好的优化和工具,并根据需要重构框架的部分。LL

Assembly 为什么x86 movsd会导致三重故障异常?

以下x86指令导致三重故障异常(cpu重置)。知道为什么吗 0042F94B F20F100520E44300 movsd xmm0,qword [dword 0x43e420] 在该指令之前插入了以下代码,以验证0x43e420处的内存是否可访问(它是可访问的): X86处于保护模式。GDT设置正确,除cs为0x8外,段寄存器均为0x10。两个GDT条目都是扁平的,并且会占用整个32位内存空间。未设置eflags上的对齐检查(AC) 0x43e420处的内存为: 0x43e420: 00

Assembly 我们什么时候需要MIPS中的$v1?

我们都知道程序通常只返回一个值,但我注意到在MIPS中有两个值返回寄存器$v0和$v1。我看到的代码都只有$v0但是$v1,而且我还没有找到任何使用$v1的汇编语言示例代码 有谁能告诉我为什么我们在MIPS中有两个$v寄存器,并给我看一个什么时候可以使用它的例子吗?我可以想出很多例子,但这可能取决于您的判断。最好的例子可能是一个函数,它返回$v0中的值,并可能在$v1中设置错误代码。另一个用例是在32位MIPS上返回64位数字(或在64位MIPS中返回128位数字)。这有很多用途 返回两倍于寄

Assembly 在x86中使用两个内存操作数

为什么在x86的指令movx中使用两个内存操作数是不对的?有硬件问题吗?硬件问题是指令集没有这样的指令 CPU当然可以通过允许两个内存操作数的指令进行扩展,但Intel没有做到这一点,因为它确实没有多大好处。为什么会这样?硬件问题是指令集没有这样的指令 CPU当然可以通过允许两个内存操作数的指令进行扩展,但Intel没有做到这一点,因为它确实没有多大好处。为什么会这样?硬件问题是指令集没有这样的指令 CPU当然可以通过允许两个内存操作数的指令进行扩展,但Intel没有做到这一点,因为它确实没有多

Assembly 在x86中打印整数(作为变量)

我有一个全局变量,它计算函数被访问的次数。每次我访问一个特定函数时,该函数的最后一行是这样的:添加变量计数,1。 然后,我有另一个函数打印这个全局变量,问题是:我不能打印它 这是我正在打印的代码: .data var_count db 0 .code ...piece of code mov ah,9 lea dx, var_count int 21h ...piece of code 以下是您的程序可能成为的内容。我使用了你在评论中写的大部分代码。在创建数字的文本版本时,我们从

Assembly 指令和微操作之间的区别

机器指令和微操作之间有什么区别?我发现了以下定义: 一种小型的基本指令,串联使用以构成高级指令 机器指令 这是我在网上找到的 在计算机中央处理器中,微操作(也称为 微操作(micro-ops或μops)是一些应用程序中使用的详细的低级指令 实现复杂机器指令的设计(有时称为 宏指令(在此上下文中) 我的理解正确吗?micro op是一种在给定周期内执行的处理器指令。说like并加上,SUB,MUL,ST,LD。我错过什么了吗 感谢您的帮助。几年前,人们发现RISC比CISC更好。如果您想要一个非常

Assembly 将整数转换为字符串汇编8086 tasm

我正在用tasm汇编程序使用汇编8086 16位。 我试图打印一个int变量,为此我需要将变量contant转换为string。我试图建立一个程序,但没有成功。这完全是错误的,不起作用 你能帮我建立这个/解释如何建立这个吗 谢谢大家 这是我现在的基本代码: stepCounter db 0 push offset stepCounter ; Copy the OFFSET of "parameter" into the stack call toString proc t

Assembly arm霓虹灯比较操作生成负数

我正在尝试以下汇编代码: vclt.f32 q9,q0,#0 vst1.i32 q9,[r2:128] 但如果条件为真,则q9中的相应元素将设置为负元素,而不是正元素 如何才能得到一个正数?这对于向量比较指令来说是正常的,因此您可以将比较结果用作与AND或XOR指令或各种其他用例的掩码 你通常不需要+1。例如,如果要计算匹配的元素数,只需使用减法指令从向量累加器中减去0或-1即可 要得到一个整数+1,可以从0中减去它,或者通过元素大小-1右移。(例如,逻辑右移31,仅保留低位0或1,其余位均

Assembly ARM Neon:添加相邻两次以平均四个相邻像素

我有4条车道d0、d1、d2、d3,我想平均四条相邻车道: d0[0] = (d0[0] + d0[1] + d0[2] + d0[3]) / 4 d0[1] = (d0[4] + d0[5] + d0[6] + d0[7]) / 4 d0[2] = (d1[0] + d1[1] + d1[2] + d1[3]) / 4 ... 以下霓虹灯代码正确吗 vpaddl.u8 d0, d0 vpaddl.u8 d1, d1 vpaddl.u8 d2, d2 vpaddl.u8 d3, d3 v

Assembly 软控制台4.0“;“错误指令”;汇编程序

使用MicroSemi SoftConsole 4.0尝试编译并运行FreeRTOS演示项目,我遇到了一个错误“错误指令”[每行代码]”。基本上,由于某种原因,整个文件没有被组装。我的控制台如下所示: Building file: ../FreeRTOS-Plus/WolfSSL/wolfcrypt/src/aes_asm.asm Invoking: Cross ARM GNU Assembler arm-none-eabi-gcc -mcpu=cortex-m3 -mthumb -O2 -g

Assembly 给定BX。将其镜像并放入CX。如何做到这一点?

给定BX。把它镜像。只能使用SHR、SHL和或XOR 例如:BX=1234h CX=4321h您没有提到是否允许使用其他寄存器,所以我假设是这样 我将只展示一些C代码,这些代码演示了如何使用给定的指令集执行所需操作,并将其转换为x86程序集,因为这应该很简单: CX = (BX & 1) << 12; AX = (BX & 2) << 12; CX |= AX; AX = (BX & 4) << 12; CX |= AX; AX = (

Assembly 在无结构的汇编中实现shanon-fano或huffman码

我正在tasm上的DOSBox模拟器上学习汇编。我需要做一个项目约1500代码行的长度在一个主题,我选择。我的想法是尝试用shanon fano或huffman代码在assmebly上实现一个文本压缩算法。我理解这两种算法的一般概念,并且我发现它们与树密切相关。由于某些原因,我们不能在代码中使用结构。所以我的问题是:我能在没有结构和经历巨大困难的情况下在汇编中构建这些算法中的一个吗。我在网上看到了这些算法的一些实现,但我没有发现任何没有我不能使用的结构或我没有的oop的实现 提前感谢。 多伦 编

Assembly 什么';“指令有什么问题吗?”;mov[si],[bx]“是吗?”;?装配

我原以为它会起作用,但事实并非如此。其思想是从[si]值中使用[bx]地址来细分值。对不起,这个愚蠢的问题括号的意思是“内存访问”。您的代码会让处理器从内存中提取一个值([bx]),并将其存储到内存中([si]),但这不是对的有效编码。事实上,没有一条x86指令可以执行这样的内存操作。你必须把它分成两部分,就像这样: mov [si],[bx] (注意,ax没有什么特别之处,这里它只是一个“暂存”寄存器。)有一条指令可以直接在两个内存位置之间移动:movs@EOF:yes,但它只从ds:[si

Assembly 如何在8086汇编中转换数字并以视频图形模式显示?

我想知道如何在8086汇编中显示消息 正如您在下面的代码中看到的,我希望通过编写“CONVERT”过程来完成我的代码。如何完成此代码 我应该在视频模式中每8个像素显示一条消息,即一个字符对应一个块 CURSOR MACRO ROW,COLUMN ;key cursor MOV AH,02H MOV BH,00 MOV DH,ROW MOV DL,COLUMN INT 10H ENDM DISPLAY MACRO STRING MOV AH,09H

Assembly 什么是美国电话电报公司;mulx的T/GAS语法?

报告说: GAS指令通常具有助记符源、目标的形式。例如,以下mov指令: 但它没有说明这条规则的例外情况,我也找不到一个指令表。似乎没有一节给出所有指令的语法(虽然它很长,我可能错过了这一节)。但是,没有明显地指定方言,并且它的参数顺序为destination和source GAS/AT&T中的mulx的语法是什么?有没有参考资料可以让我在将来轻松查找这些内容?这本维基百科: 不包括MULX,但它确实显示了列出的3个操作数IMUL指令: imul dest, src, aux

Assembly CS:IP在汇编中意味着什么?它是如何工作的?

我不明白cs:ip的意思。的角色是什么: 的角色是什么: 分隔两个寄存器的冒号根据使用的寄存器具有不同的含义 如果第一个寄存器是一个段寄存器(CS、DS、ES、FS、GS、或SS),那么整个“段寄存器:偏移寄存器”表示指向可寻址存储器(1MB+HMA)中某个位置的指针。要计算线性地址,首先将段寄存器中的值乘以16,然后将偏移寄存器中的值相加。 示例包括CS:IP,SS:SP,DS:SI,ES:DI 如果第一个寄存器不是段寄存器,则使用两个16位通用寄存器(GPRs)的组合来表示32位数字。就8

Assembly 为什么在传递参数时堆栈上会有孔?

我不太熟悉汇编代码。如果这个问题很幼稚,请原谅 我有一个简单的C程序: int f1(int a1, int a2, int a3, int a4, int a5, int a6, int a7, int a8, int a9) { int c = 3; int d = 4; return a1 + a2 + a3 + a4 + a5 + a6 + a7 + a8 + a9 + c + d; } int main(int argc, char** argv) { f1(1, 2

Assembly linux 32位汇编到C编程转换 < >我想把这个ASM代码转换成C++或C,我可以理解main中的主要概念,比如变量的定义和调用函数,但是我被推和POP命令所困扰,不能理解它们是如何工作的。 main: 0x080489cc <+0>: lea ecx,[esp+0x4] 0x080489d0 <+4>: and esp,0xfffffff0 0x080489d3 <+7>: push DWORD PTR [ecx-0x4] 0x080489d6 <+10>: push ebp 0x080489d7 <+11>: mov ebp,esp 0x080489d9 <+13>: push ebx 0x080489da <+14>: push ecx 0x080489db <+15>: sub esp,0x10 0x080489de <+18>: call 0x80488b0 <__x86.get_pc_thunk.bx> 0x080489e3 <+23>: add ebx,0xa261d 0x080489e9 <+29>: mov DWORD PTR [ebp-0xc],0x1 0x080489f0 <+36>: mov DWORD PTR [ebp-0x10],0x3 0x080489f7 <+43>: mov DWORD PTR [ebp-0x14],0x9 0x080489fe <+50>: sub esp,0x4 0x08048a01 <+53>: push DWORD PTR [ebp-0x14] 0x08048a04 <+56>: push DWORD PTR [ebp-0x10] 0x08048a07 <+59>: push DWORD PTR [ebp-0xc] 0x08048a0a <+62>: call 0x8048a34 <blender> 0x08048a0f <+67>: add esp,0x10 0x08048a12 <+70>: sub esp,0x8 0x08048a15 <+73>: push eax 0x08048a16 <+74>: lea eax,[ebx-0x2ed18] 0x08048a1c <+80>: push eax 0x08048a1d <+81>: call 0x804f100 <printf> 0x08048a22 <+86>: add esp,0x10 0x08048a25 <+89>: mov eax,0x0 0x08048a2a <+94>: lea esp,[ebp-0x8] 0x08048a2d <+97>: pop ecx 0x08048a2e <+98>: pop ebx 0x08048a2f <+99>: pop ebp 0x08048a30 <+100>: lea esp,[ecx-0x4] 0x08048a33 <+103>: ret blender: 0x08048a34 <+0>: push ebp 0x08048a35 <+1>: mov ebp,esp 0x08048a37 <+3>: call 0x8048a51 <__x86.get_pc_thunk.ax> 0x08048a3c <+8>: add eax,0xa25c4 0x08048a41 <+13>: mov edx,DWORD PTR [ebp+0x8] 0x08048a44 <+16>: mov eax,DWORD PTR [ebp+0xc] 0x08048a47 <+19>: add eax,edx 0x08048a49 <+21>: add eax,eax 0x08048a4b <+23>: imul eax,DWORD PTR [ebp+0x10] 0x08048a4f <+27>: pop ebp 0x08048a50 <+28>: ret main: 0x080489cc:lea ecx[esp+0x4] 0x080489d0:和esp,0xFFFFF0 0x080489d3:推送DWORD PTR[ecx-0x4] 0x080489d6:推动ebp 0x080489d7:mov ebp,esp 0x080489d9:推动ebx 0x080489da:推送ecx 0x080489db:子esp,0x10 0x080489de:调用0x80488b0 0x080489e3:添加ebx,0xa261d 0x080489e9:mov DWORD PTR[ebp-0xc],0x1 0x080489f0:mov DWORD PTR[ebp-0x10],0x3 0x080489f7:mov DWORD PTR[ebp-0x14],0x9 0x080489fe:子esp,0x4 0x08048a01:推送DWORD PTR[ebp-0x14] 0x08048a04:推送DWORD PTR[ebp-0x10] 0x08048a07:推送DWORD PTR[ebp-0xc] 0x08048a0a:调用0x8048a34 0x08048a0f:添加esp,0x10 0x08048a12:子esp,0x8 0x08048a15:推送eax 0x08048a16:lea eax[ebx-0x2ed18] 0x08048a1c:推送eax 0x08048a1d:调用0x804f100 0x08048a22:添加esp,0x10 0x08048a25:mov eax,0x0 0x08048a2a:lea esp[ebp-0x8] 0x08048a2d:pop ecx 0x08048a2e:pop ebx 0x08048a2f:弹出ebp 0x08048a30:lea esp[ecx-0x4] 0x08048a33:ret 搅拌机: 0x08048a34:推动ebp 0x08048a35:mov ebp,esp 0x08048a37:调用0x8048a51 0x08048a3c:添加eax,0xa25c4 0x08048a41:mov edx,DWORD PTR[ebp+0x8] 0x08048a44:mov eax,DWORD PTR[ebp+0xc] 0x08048a47:添加eax、edx 0x08048a49:添加eax,eax 0x08048a4b:imul eax,DWORD PTR[ebp+0x10] 0x08048a4f:弹出ebp 0x08048a50:ret

主管道内() 从0x080489e9到0x080489f7//清除三个4字节整数,并用1,3和9初始化它们 我们可以将这一部分假设为: int a = 1; int b = 3; int c = 9; 从0x08048a01到0x08048a0a//从右向左推送变量,将其作为参数发送到blender函数,然后调用blender 搅拌机(a、b、c) 内部搅拌器() 在blender调用之后,它调用0x08048a1d:call 0x804f100函数并打印结果,我认为这是printf内部的直接

Assembly 在程序集中将一个数组的内容复制到另一个数组

我想创建两个数组,大小都是5,然后填充第一个数组。然后我想用另一个元素填充空白数组,但是顺序相反。strong>唯一的检查是我不能在本练习中使用循环,这就是为什么大小设置为一个小数字,在本例中为5。 目前,我正在努力解决许多问题,但我的代码如下所示: a DB 4, 72, 52, 12, 29 b DB 0, 0, 0, 0, 0 ;I don't know how to define an empty array, so I am setting everything to zero LE

Assembly 两个或三个操作数的ARM ADD之间的差异?

查看armkeil的文档,在执行ADD函数时,始终需要3个变量,例如: "MOV r2,#4 \n\t" "ADD r2,r2,#3 \n\t" 这在寄存器2中的结果为7。 但当我尝试以下方法时: "MOV r2,#4 \n\t" "ADD r2,#3 \n\t" 结果是一样的,这两种方法的根本区别是什么?是否允许使用第二个操作数?当中间操作数(第一个源)与目标操作数相同时,ARM语法允许省略中间操作数。(至少在GAS“统一”中)语法;最初的ARM Thumb语法仅在机器编码实际有单独的目的

Assembly 程序集x86:用户登录

我正在尝试为我的操作系统创建一个登录表单。就像Kali Linux的SSH登录一样。将显示用户,但不会显示密码。我使用int16h/ah=0读取按键。但是我不知道接受一行输入(比如Python中的input())和连接两个字符串。我看到了解释连接两个字符串的主题,但没有找到任何关于在汇编中获取一行输入的主题。我使用NASM进行编译 我的代码: bits 16 org 0x7c00 mov si, loginmsg call ps call nl mov si, usermsg call ps

Assembly 在CPU上执行一条指令

我想知道,有没有非仿真器的方法来要求CPU处理单个指令? 我的意思是像使用解释器一样使用实际的CPU。是的。您可以直接执行它并跳回代码,也可以使用操作系统和体系结构的调试器功能将它放在一个不同的进程中。您是否考虑了特定的指令集体系结构?例如,x86处理器具有单步执行的陷阱标志。@fuz是的,你说得对。我想到了x86primarily@nonForgivingJesus然后查看陷阱标志。基本上,设置它会在执行每条指令后生成一个中断,这样您就可以一次执行一条指令。S390架构的大型机甚至有一个EX(

Assembly “mov-DS,ES,Si,Di,extra”实际上是做什么的?

这是我的完整程序,是否正确。否则有人能告诉我哪里错了 EXTRA SEGMENT ARRAY1 DW "DEVS2070" VAR DB 0H EXTRA ENDS CODE SEGMENT ASSUME CS:CODE,ES:EXTRA START: MOV AX,0600H MOV DS,AX MOV AX,EXTRA MOV ES,AX MOV SI,0000H LEA DI,ARRAY1 MOV CX,08H CLD REPE CMPSB JNZ SKIP MOV

上一页 1 2 ...  5   6   7   8    9   10   11  ... 下一页 最后一页 共 493 页