Assembly 什么与cmovl操作码中的内容相比较?

在汇编操作码cmovl中,比较了什么? 例如: EAX:00000002 EBX:00000001 cmovl eax,ebx 结果如何?哪一个需要少一点才能移动 谢谢大家! 它前面应该有另一条适当设置标志的指令,如cmp cmp ebx, ecx ; compare ebx to ecx and set flags. cmovl ebx, eax ; if (ebx < ecx (comparison based on flags)) ebx = eax cmp-ebx,ecx

Assembly 处理程序集BIOS调用中的换行符/CR

我正在学习汇编,我正在尝试使用BIOS调用从键盘读取/打印到键盘。到目前为止,我有以下几点: loop: xor ah, ah int 0x16 ; wait for a charater mov ah, 0x0e int 0x10 ; write character jmp loop 在有人按enter键之前,此操作正常-当光标移动到当前行的开始处,而不是下一行的开始处时,似乎正在处理CR(\r),而不是换行符(\n) 有什

Assembly 一个简单的集合问题

我是新来组装的,这很有趣。无论如何,我有一个问题 cmpw cr7, %r29, %r8 如果cr7>%r29和%r8,该代码是否等同于?它将r29与r8进行比较,并将结果放入cr7中,我相信 换言之: cr7=r29-r8 在读取一些PPC文档后,它看起来像cr(比较寄存器),获得一个编码值,表示更少、更大、相等 less: 0x100 greater: 0x010 equal: 0x001 在其他架构(如x86)中,没有CR本身,而是一组标志,如ZF、SF和CF(零、符号和进位

Assembly 关于增量、减量和乘法的一些集合问题

我面临着一些问题,因为我正在学习的IA-32汇编电子书中没有明确介绍这些问题: 1-EFLAGS寄存器状态部分的零位是受“INC”(递增)和“Dec”(递减)指令影响的状态位中的唯一位,还是奇偶校验位也受影响? 2-mul(无符号整数乘法)指令是否影响EFLAGS寄存器的状态部分? 最后还有一句话我不确定自己是否理解清楚: “IMUL指令既可用于有符号整数,也可用于无符号整数,但必须注意,结果不会使用目标的最高有效位。对于较大的值,IMUL指令仅对有符号整数有效。” 我的概念是,当你要使用这条指

Assembly spim模拟器pcspim:地址处的错误设置值

您好,我正在使用spim模拟器pcspim,我正在尝试使用模拟器菜单下的set value选项在地址处设置一个值 当我尝试为例如oxb1234567设置一个msb为1的值时,该地址的值默认为7fffffff,有人能解释这种行为的原因吗 在MIPS中,以1(MSB=1)开头的地址表示内核内存空间。如果不使用系统调用,就无法从用户空间(MSB=0)访问内核空间。我想你搞错了。。。。我地址的msb不是1。。。。。。我的值的msb是1Oh对不起,我看错了。我不知道为什么会这样。我可以推荐IMHO作为更好

Assembly 比整数模运算更快?

可以重新表达: 我是%m 作为: i和(m-1) 在哪里, i是一个无符号整数 m是2的幂 我的问题是:手术和手术是否更快?难道现代CPU不支持单指令中硬件的整数模运算吗?我对ARM很感兴趣,但在它的指令集中看不到模运算。如果您使用的是启用了优化功能的体面的C编译器,它会将其优化到更快的速度,这是一种称为“强度降低”的技术。若你们在做手写汇编,唯一可靠的测试方法就是对它进行基准测试。但是要注意,即使是同一处理器的不同型号也可能给出不同的结果。根据,ARM没有除法指令。如果这是真的,那

Assembly 编写汇编程序的见解

我定义了一个指令集,它只有加载、存储、移动、加法和减法运算。现在我想编写一个汇编程序,它将获取一个包含我定义的指令的文件,并生成可执行代码 我知道编译器构造的理论,如扫描、解析、中间代码等。我想用C编写。我已经浏览了一些链接,如compilers.iecc.com/crenshaw/和其他几个链接 我陷入了一些问题,比如如何将我的指令映射到底层处理器提供的指令?如何为x86以及68000生成可执行代码等。我定义了一个非常小的指令集,我不想为了简单而进行优化。有谁能帮我回答上述问题并给我一些见解吗

Assembly 在x86-64 AT&;中,地址前的星号*表示什么;T组装?

下面这行是什么意思 ... 401147: ff 24 c5 80 26 40 00 jmpq *0x402680(,%rax,8) ... 内存地址前面的星号是什么意思? 另外,当内存访问方法缺少它的第一个寄存器值时,这意味着什么 通常它类似于(“%register”,%rax,8),但在本例中它没有第一个寄存器 有什么提示吗?这是跳转到内存中包含的地址。地址存储在内存中的地址rax*8+0x402680,其中rax是当前的rax值(当此指令执行时)。将内容转换为英特尔语法总是让内

Assembly 组件中的循环不';行不通

我在尝试在asm中创建循环时遇到了一些问题。 所以我用循环创建了另一个代码。 问题是,当我减少或增加ecx时,变量会出错。 如果我使用没有dec的循环指令,它也不会工作。 如何使用ecx循环 代码 ecx值不保证在printf调用中保留。改用下列寄存器之一:ebx,ebp,esi,edi。您也应该通过将choise寄存器推到堆栈上并在之后恢复来保存它们。您是对的,jmp runloop在那里没有任何用处。 section .text global main extern p

Assembly 尝试启用保护模式时启动循环

我正在编写一个基本的引导加载程序,在这样的环境中,我可以编写一个简单的C程序,将其写入硬盘(没有文件系统),然后运行它。这就是我想要做的 这是我到目前为止所做的 第一阶段: 设置堆栈和段寄存器 将视频模式更改为640x480x8 将下一个扇区读取到内存 跳远 第2阶段: 再次设置堆栈和段(是否需要再次执行此操作?) 设置GDT(这部分让我很困惑——TBH我只是复制/粘贴) 启用A20门 进入保护模式 我以前成功地进入了保护模式,但由于某些原因,现在我不能。当我尝试时,Bochs进入启动循环,但据

Assembly 8086组件,关于PTR操作员

这可能是简单和愚蠢的,但我还是会问,因为我似乎无法理解它 一个简单的代码片段: assume cs:code, ds:data data segment b dd 256 data ends code segment start: mov ax,data mov ds,ax mov ax,word ptr b -> the result of this operation will be ax:= 256 (100

Assembly 如何屏蔽/阻止某些IRQ

仍在使用x86 NASM汇编操作系统 我最后一个问题的后续问题(): 在我意识到CLI和STI指令正确关闭了所有中断后,我不久还意识到系统计时器和RTC时钟本身就是中断(请参阅)。这就是时钟无法工作的原因——它会一直等待,直到系统计时器开始更新。这显然从未发生过,因为更新的中断已关闭 不幸的是,知道这一点并不能解决我的原子性问题:系统时钟不能在没有中断的情况下读取。然而,在上设置中断并不能确保原子性 我听说有一些方法可以掩盖一些中断,但不是全部。我想知道如何屏蔽除0和8之外的所有中断(参见维基百

Assembly 如何使用masm32编写.com程序

有人能告诉或建议我如何使用masm32编写.com程序吗? 我曾尝试使用Exe2Bin命令将.exe转换为.com程序,但没有 祝你好运。每当我运行此命令时,请使用查看错误:无法转换文件。 有没有其他方法可以做到这一点?为什么不改用Nasm呢?Nasm很棒,但我认为有一种方法可以用Masm做到这一点。。。尝试.model tiny,或者在命令行上尝试/t。内存让我无法使用…这里有一些信息:.COM有几个严格的要求,其中一个要求是,正如@FrankKotler所指出的,在x86上使用最小的内存模型

Assembly ARM汇编代码

我是ARM架构的初学者。我有一个汇编ARM arch上的程序,我必须知道程序中的每个字符串是什么意思。这是什么意思?我找不到关于它的信息。请帮帮我。谢谢你 @ args = 0, pretend = 0, frame = 40 @ frame_needed = 0, uses_anonymous_args = 0 fstmfdd>sp!, {d8, d9} bl<>__aeabi_l2d it eq fmdrr<->d6, r0, r1 fdivd<->

Assembly 在堆栈上放置64位地址

如何在堆栈上放置64位长的地址? 我目前有: //setup the stack push rbp; mov rbp, rsp; sub rsp, 80; //80 bytes for stack, 9 args of 64 bits + 64 bits for the function address mov qword [rbp - 72], 0xfefefefe12345678; // <--- won't work call [rbp - 72]; //Restore stac

Assembly 装配新手

我想开始学习汇编语言,但我不知道从哪里开始。我知道汇编依赖于处理器的体系结构。所以我现在有一个问题如果我在我的系统上编写一些汇编代码,它是否可能无法在另一台计算机上工作?如果不是,Windows或Linux是如何创建的,因此它几乎可以在所有计算机上运行。还是我错了?汇编语言是处理器的语言。不同的处理器,不同的语言 实现这一目标的方法有很多。用C编写然后在目标处理器上编译C程序是一种方法。使用虚拟机是另一种选择 某些可移植性是由具有类似指令集的同一系列处理器实现的。因此,英特尔和AMD处理器将运行

Assembly 循环结构跳过一些字母?

我这里有一个代码,应该是: 听取意见 比较字母表中的每个小写字母“a”-“z”/97d-122d 比较当前字符是否相等输入:如果为真,则继续转换和回显 增量电流字符 比较计数器是否等于限制,同时不继续测试字符 如果在a-z中未找到,则显示无效输入消息并转到输入提示 这是我的密码: .model small .stack 100h .data Prompt db 10, 13, 10, 13, "Enter character: $" Upper db 10, 13,

Assembly 如何在指令集保护模式下使用组合键?

我用这段代码从键盘上获取输入,但我想不出一种方法来获取shift+a=a这样的组合键 keypressed: in al,60h test al,80h jnz keypressed and al,7fh mov bx,table dec al xlat cmp al,0 je key call put_char key: in al,60h test al,80h

Assembly Masm32链接器不工作

我正在尝试学习汇编语言,下面是我的教程:。我可以很好地组装代码,但是当涉及到链接.obj文件时,会发生一些奇怪的事情。我键入ml/c/coff/Cp msgbox.asm来组装它,然后链接/SUBSYSTEM:WINDOWS/LIBPATH:c:\masm32\lib msgbox.obj。当我这样做时,我只得到一个无限滚动循环C:\work\code\ASM>link/SUBSYSTEM:WINDOWS/LIBPATH:C:\masm32\lib msgbox.obj。当我在Masm32编辑器

Assembly 什么是';添加0x804a460(,%ecx,4),%edx';做

我需要帮助解释这行代码: 0x08048e26 <+43>: add 0x804a460(,%ecx,4),%edx 0x08048e26:添加0x804a460(,%ecx,4),%edx 我不确定这到底是什么意思。我将其解释为%edx=4*%ecx+0x804a460。但这似乎并不正确,因为在运行指令后,%edx从来没有包含我希望它包含的值。C中的等效值是 edx += *((int*)0x804a460 + ecx) 看起来它正在索引到一个静态表中以获取

Assembly 在汇编程序中写入文件

我的任务是创建一个程序,将一些字符串写入文件。到目前为止,我想到了这个: org 100h mov dx, text mov bx, filename mov cx, 5 mov ah, 40h int 21h mov ax, 4c00h int 21h text db "Adam$" filename db "name.txt",0 但它什么也没用。我使用的是nasm和dosbox。您必须首先创建文件(如果已经存在,则打开

Assembly 如何更改ELF ARM EABI文件的段文本大小?

我有ELF ARM EABI文件,没有源代码。它是二进制的.so文件 如何扩展文件段文本的大小 我知道这个二进制文件中的中断代码,但现在它不是问题。使用objcopy并调整LMA/VMA可能也必须对.text之后的部分执行此操作。或者,将.text提取到一个文件中,将其余部分复制到一个新文件中,然后将放大的.text添加回。

Assembly 8086中的堆栈段和堆栈指针

我对堆栈段(ss)和堆栈指针(sp)寄存器有点困惑。 堆栈为空时,sp值是否等于ss值? 我读到,当我们将一个字(2字节)推送到堆栈时,sp将递减2,如果第一个语句为true(sp=ss),那么我可以说,如果堆栈不是空的,堆栈指针的值总是小于或等于堆栈段的值,这是真的吗??。 如果我们影响sp的值,使其大于ss,会发生什么情况??即: mov-ss,200h mov sp,400小时 mov-ax,1010h 推斧 请纠正任何错误,thanx提前否,ss是一个段寄存器,与其他寄存器一样,如cs或

Assembly 与x86和x86-64程序集中的堆栈指针的区别

我比较了由clang编译的代码的输出与-m32和未编译的代码的输出,不禁注意到64位部分缺少每个方法中堆栈指针寄存器的递增和递减 32位: main: # @main push ebp mov ebp, esp sub esp, 8 # here mov eax, 0 mov dword ptr [ebp - 4], 10 m

Assembly 列MASM中的数组输出

我正在运行一个程序,要求用户输入要显示的复合数字的数量。例如,如果用户输入10,程序将显示前10个复合数字 我遇到的问题是,我的程序在一个长列中打印所有值,我需要让输出以每行10个复合数字显示,每行之间至少有3个空格。代码如下: INCLUDE Irvine32.inc .data userInt1 DWORD ? ;integer to be entered by user userInt2 DWORD ? ;integer t

Assembly 使用CPUID测试SSE2,而不是尝试SSE2指令和SIGILL?

我正在查看一些执行以下操作的库代码。CpuId功能按预期运行。它加载EAX(函数)、ECX(子函数),然后调用CPUID struct CPUIDinfo { word32 EAX; word32 EBX; word32 ECX; word32 EDX; }; ... CPUIDinfo info; CpuId(1 /*EAX=1*/, 0 /*ECX=0*, info); if ((info.EDX & (1 << 26)) != 0)

Assembly 汇编语言中的32位除法

我正在大学学习汇编语言编程(80386编程)。目前,我正在学习使用EDX和EAX寄存器分别存储余数和商的32位除法的输入和输出。我想知道,为什么当我没有包含 mov edx, 00000000h 在我的节目里。程序要么不运行,要么输出错误 相关源代码: mov edx, 00000000h mov eax, 1234567Ah div 11111111h ; now EDX=remainder, EAX=quotient 如果需要,我将发布完整的代码。32位div实际上将edx:eax除以指

Assembly 使用8位寄存器添加两个16位数字(汇编)

我需要使用add和adc指令添加两个16位数字。我使用的微控制器是一个最大寄存器大小为8位的AtMega32 这是我迄今为止所尝试的,例如我正在添加数字5438+6098 .include "m32def.inc" .org 0x0000 init: ldi r16,54 ldi r17,38 ldi r18,60 ldi r19,98 start: add r17,r19 adc r16,r18 rjmp init 如果我加上较低的字节38和98=136,这是一个8位的数字,所以它存储

Assembly ARM汇编函数,用于替换字符串中的特定字符

我正在编写一个ARM汇编函数,它用另一个字符串替换字符串中的一个特定字符,并计算替换在末尾发生的次数。到目前为止,我已经做到了: .global subs subs: stmfd sp!, {v1-v6, lr} //string entry mov v1, #0 //set index to 0 mov v2, #0 // set count to 0 loop : ldrb v3, [a1], #1 cmp a2, v3

Assembly 为什么不是';这首歌不是一直在集合中播放吗?

我正在上一堂组装入门课,在最后一个项目中,我们必须制作一个播放“生日快乐”的程序 问题是,程序将歌曲播放到一半(到第13个音符),然后停止播放。我已经尽了一切努力来修复它,但我不知道为什么它不应该工作。我试着改变代码,改变循环的工作方式,改变哪些寄存器持有不同的值,但似乎没有任何效果。我查看了调试,没有发现任何异常。这是程序的代码: ;data segment dseg segment para 'data' ;hex value for each note to send

Assembly MIPS SYSCALL指令是如何工作的?

我们很清楚有三种类型的中断: 内部中断 外部中断 软件中断 因此,系统调用是一个软件中断。二进制形式的MIPS SYSCALL指令为 0000000000000000000000 1100 当cpu获取该指令并执行该指令时会发生什么情况。在某些寄存器中,在该指令之前传递的参数在这里并不重要,关键问题是该指令本身做什么,它的工作是什么,它在cpu中如何工作 仅运行此指令对机器的体系结构状态有何影响? 这意味着,如果跳转到另一个内存位置(如中断向量表),受此系统调用(指令)影响的寄存器值、它打开的标

Assembly IDA代码段,eax移到全局变量中

做《实用恶意软件分析》一书中的练习(实验5-1) 全局变量dword_1008E5C4(第二张图片)应该包含OS版本,但从我看到的情况来看,由于 sub_10003695 我错过什么了吗 是的,setz指令,根据上面的比较结果设置al(eax的一部分)的值。该函数具有以下特征: BOOL WINAPI GetVersionEx( _Inout_ LPOSVERSIONINFO lpVersionInfo ); 因此,它在堆栈上的局部变量(此处引用了rel toEBP)中返回一个结构(或O

Assembly 如何使用LC-3程序添加数字,并使其在寄存器中正确显示?

使用LC-3汇编,我试图将R0到R5的值设置为0。然后,我试图通过将5设置为R5,将1分配给R1,2分配给R2,以此类推。最后,我尝试计算总和并将结果存储在R0中 到目前为止,我的代码如下: .ORIG x3000 AND R0,R0,#0 AND R1,R1,#0 AND R2,R2,#0 AND R3,R3,#0 AND R4,R4,#0 AND R5,R5,#0 ADD R1,R1,#1 ADD R2,R2,#2 ADD R3,R3,#3 ADD R4,R4,#4 ADD R5,R5,#5

Assembly 可能加密代码的反向工程汇编程序?

我使用带有集成汇编程序的IDE为一家公司的微控制器编写代码,该公司也生产我刚才提到的IDE和汇编程序。 因为带有硬件在电路编程器的开发工具包非常昂贵,我想对他们将编写的源代码组装成文件格式的方式进行反向工程,然后通过编程设备将其传输到控制器 所以基本上我所做的是编写一个非常基本的汇编程序(如下所示): 而且变化很小(像这样): 然后我看了一下生成的二进制文件。我所期望的甚至与实际发生的事情并不接近: 不只是一个字节改变了(我希望如此),而是总共2300个字节中的2000个字节改变了 可能实现这一

Assembly 汇编语言数学函数:

由于某些原因,这实际上不会进入我的其他功能,如减法、除法等。当我将我的数字输入程序时,它会接受这些数字,并只打印出我存储在系统中的第一个数字。我可能需要修正我的控制结构也许?这应该是一个简单的计算器,需要两个数字和一个符号,并给出一个答案。我的另一个问题是,在我输入两个数字后,打印“=”号的最佳方式是什么。 谢谢 segment .data segment .bss num1: resb 4 num2: resb 4 button: resb 2 segment .text glob

Assembly MIPS汇编语言-Base64编码?

这个程序的要点是对用户提供的字符串进行base64编码,然后输出新的编码字符串 编码是通过从原始字符串中收集3个字符(每个字符为8位)然后将其拆分为4个字符(每个字符为6位)来完成的 如何正确访问和操作用户输入的字符串 目前,第一次迭代带来了正确的输出,但第二次迭代总是给t2值“0”,无论输入是什么,这将使用输出A停止程序;两者都是错误的 .data sentence: .space 64 prompt: .asciiz "Enter the string: " ASC: .byte 'A

Assembly 从引导加载程序进入保护模式时出现问题

此程序集代码从引导加载程序进入受保护模式,但在调用远跳转并重新启动后,无法重置CS段(或执行远跳转)。如果我删除远跳转,它将在保护模式下进入无限循环(0x66,jmp$),无需重新启动 [bits 16] [org 0x7c00] xor ax,ax xor eax,eax add eax,ENTRY_POINT_32 ;address to plug to far jmp mov [ENTRY_OFF],eax xor eax,eax mov eax,GDT ;l

Assembly CL比较验证范围不工作

我正在验证一些输入;输入数字应介于1到255之间。我尝试下面的代码输入定义;输入DC CL60''” clc input,=c'255' bh loop1 clc input,=c'1' bl loop1 J loop2 loop1 上述验证仅适用于3位数字(从100到255) 但它不适用于两位数。请您帮助我:)当汇编程序生成比较长度时,它是基于第一个操作数的。您在代码中没有显示这一点,但我的假设是 输入DS CL3 在这种情况下,指令CLCinp

Assembly 当CPU处于内核模式时,它能读写任何寄存器吗?

当CPU处于内核模式时,它是否可以读取和写入任何寄存器,或者是否存在一些即使在内核模式下也无法访问的寄存器?在x86上,没有存储寄存器,因此所有寄存器在架构上同时可见 是的,在内核模式(环0)下,x86可以写入任何寄存器。(只要内核在64位模式下运行,否则它无法访问x/ymm8..16或zmm8..31或r8..r15) 是的,从64位用户空间进入内核后,可以切换到32位模式的内核;Solaris x86-64显然做到了这一点,并与32位内核驱动程序兼容。在内存小于4GB、缓存较小的机器上,在内

Assembly 在程序集中使用地址作为参数

我正在写一个有两个参数的过程,一个是数字,另一个是数组的地址。我怎样才能为它编写原型? 我试着: Print proto dword: Asz, Addr Arrayn 以及: Print proto dword: Asz, OFFSET Arrayn 但这两个都不适合我 试试看 Print proto Asz:dword, Arrayn:ptr byte 或者如果需要的话 Print proto Asz:dword, Arrayn:near ptr byte 过程(proc)将需要相

Assembly 我的整数在mips中打印错误

我的任务是在mips中实现herons公式,如下所示 A^2=s(s-a)(s-b)(s-c) 其中s是(a+b+c)/2和a,b和c是三角形的边 任务是打印出A^2,但每当我尝试这样做时,我总是得到0.0x,而不是x。例如,如果我输入a,b,c=2我应该得到3,但我得到0.03 main: li $v0, 5 syscall move $s1, $v0 li $v0, 5 syscall move $s2, $v0 li $v0, 5 syscall move $s3, $v0 sys

Assembly 数字转换

MIPS汇编语言程序,以交互方式运行以在十进制、二进制和十六进制之间进行转换 请求输入数据类型 请求输入数据 请求输出数据类型 输出数据。使用任何算法 这是我作业的要求,我已经写了下面的代码,让我知道为什么它在运行时会掉下来 这是我的代码,请让我知道为什么它不能正常工作 #Provide data variable and data as an input and output .Data Input1: .asciiz "Kindly enter the input X:&q

Assembly 假设三位指数字段和四位有效位,-8.75的位模式是什么(基于pep/9汇编语言)

这个问题基于计算机系统pep/9,我需要有人解释如何将-8.75数字转换为二进制。“-8.75”十进制是“-1000.11”二进制。对于四位有效位,需要进行一些舍入 -8.75 decimal -1000.11 *2^0 binary -1001. *2^0 rounded to 4 bit significand -1.001 *2^3 Exponent shift 将有效位更改为隐含前导位的编码位将意味着5位有效位(4位编码) OP不清楚使用什么指数偏差进行

Assembly 什么是处理器锁定信号及其工作原理?

我正在读一本关于汇编(中级)的书,书中提到一些指令,如xchg自动断言处理器锁定信号。在线搜索显示,它给予处理器任何共享内存的独占权,而没有具体细节。这让我想知道这个权利是如何运作的 这是否意味着任何其他计算机设备,例如GPU或其他设备,都不能访问内存。实际上,其他设备可以直接与RAM通信,而无需首先通过CPU 处理器如何知道它处于这种锁定状态?例如,它是否保存在控件或rflags寄存器中?或者什么,因为我看不到在使用多核CPU时该操作是如何工作的 我访问的网站说,锁定所有共享内存。这是否意味着