在汇编操作码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
我正在学习汇编,我正在尝试使用BIOS调用从键盘读取/打印到键盘。到目前为止,我有以下几点:
loop:
xor ah, ah
int 0x16 ; wait for a charater
mov ah, 0x0e
int 0x10 ; write character
jmp loop
在有人按enter键之前,此操作正常-当光标移动到当前行的开始处,而不是下一行的开始处时,似乎正在处理CR(\r),而不是换行符(\n)
有什
我是新来组装的,这很有趣。无论如何,我有一个问题
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(零、符号和进位
我面临着一些问题,因为我正在学习的IA-32汇编电子书中没有明确介绍这些问题:
1-EFLAGS寄存器状态部分的零位是受“INC”(递增)和“Dec”(递减)指令影响的状态位中的唯一位,还是奇偶校验位也受影响?
2-mul(无符号整数乘法)指令是否影响EFLAGS寄存器的状态部分?
最后还有一句话我不确定自己是否理解清楚:
“IMUL指令既可用于有符号整数,也可用于无符号整数,但必须注意,结果不会使用目标的最高有效位。对于较大的值,IMUL指令仅对有符号整数有效。”
我的概念是,当你要使用这条指
您好,我正在使用spim模拟器pcspim,我正在尝试使用模拟器菜单下的set value选项在地址处设置一个值
当我尝试为例如oxb1234567设置一个msb为1的值时,该地址的值默认为7fffffff,有人能解释这种行为的原因吗
在MIPS中,以1(MSB=1)开头的地址表示内核内存空间。如果不使用系统调用,就无法从用户空间(MSB=0)访问内核空间。我想你搞错了。。。。我地址的msb不是1。。。。。。我的值的msb是1Oh对不起,我看错了。我不知道为什么会这样。我可以推荐IMHO作为更好
可以重新表达:
我是%m
作为:
i和(m-1)
在哪里,
i是一个无符号整数
m是2的幂
我的问题是:手术和手术是否更快?难道现代CPU不支持单指令中硬件的整数模运算吗?我对ARM很感兴趣,但在它的指令集中看不到模运算。如果您使用的是启用了优化功能的体面的C编译器,它会将其优化到更快的速度,这是一种称为“强度降低”的技术。若你们在做手写汇编,唯一可靠的测试方法就是对它进行基准测试。但是要注意,即使是同一处理器的不同型号也可能给出不同的结果。根据,ARM没有除法指令。如果这是真的,那
我定义了一个指令集,它只有加载、存储、移动、加法和减法运算。现在我想编写一个汇编程序,它将获取一个包含我定义的指令的文件,并生成可执行代码
我知道编译器构造的理论,如扫描、解析、中间代码等。我想用C编写。我已经浏览了一些链接,如compilers.iecc.com/crenshaw/和其他几个链接
我陷入了一些问题,比如如何将我的指令映射到底层处理器提供的指令?如何为x86以及68000生成可执行代码等。我定义了一个非常小的指令集,我不想为了简单而进行优化。有谁能帮我回答上述问题并给我一些见解吗
下面这行是什么意思
...
401147: ff 24 c5 80 26 40 00 jmpq *0x402680(,%rax,8)
...
内存地址前面的星号是什么意思?
另外,当内存访问方法缺少它的第一个寄存器值时,这意味着什么
通常它类似于(“%register”,%rax,8),但在本例中它没有第一个寄存器
有什么提示吗?这是跳转到内存中包含的地址。地址存储在内存中的地址rax*8+0x402680,其中rax是当前的rax值(当此指令执行时)。将内容转换为英特尔语法总是让内
我在尝试在asm中创建循环时遇到了一些问题。
所以我用循环创建了另一个代码。
问题是,当我减少或增加ecx时,变量会出错。
如果我使用没有dec的循环指令,它也不会工作。
如何使用ecx循环
代码
ecx值不保证在printf调用中保留。改用下列寄存器之一:ebx,ebp,esi,edi。您也应该通过将choise寄存器推到堆栈上并在之后恢复来保存它们。您是对的,jmp runloop在那里没有任何用处。
section .text
global main
extern p
GCC在为我的以下代码注册错误后告诉垃圾“-4%ebp”:
static __inline__ int xchg_asm(int* lock, int val)
{
int ret;
__asm__ __volatile__(
LOCK "movl %1,%%eax; xchg (%1),%2 ; movl %%eax %0"
:"=m" (ret)
我正在编写一个基本的引导加载程序,在这样的环境中,我可以编写一个简单的C程序,将其写入硬盘(没有文件系统),然后运行它。这就是我想要做的
这是我到目前为止所做的
第一阶段:
设置堆栈和段寄存器
将视频模式更改为640x480x8
将下一个扇区读取到内存
跳远
第2阶段:
再次设置堆栈和段(是否需要再次执行此操作?)
设置GDT(这部分让我很困惑——TBH我只是复制/粘贴)
启用A20门
进入保护模式
我以前成功地进入了保护模式,但由于某些原因,现在我不能。当我尝试时,Bochs进入启动循环,但据
这可能是简单和愚蠢的,但我还是会问,因为我似乎无法理解它
一个简单的代码片段:
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
仍在使用x86 NASM汇编操作系统
我最后一个问题的后续问题():
在我意识到CLI和STI指令正确关闭了所有中断后,我不久还意识到系统计时器和RTC时钟本身就是中断(请参阅)。这就是时钟无法工作的原因——它会一直等待,直到系统计时器开始更新。这显然从未发生过,因为更新的中断已关闭
不幸的是,知道这一点并不能解决我的原子性问题:系统时钟不能在没有中断的情况下读取。然而,在上设置中断并不能确保原子性
我听说有一些方法可以掩盖一些中断,但不是全部。我想知道如何屏蔽除0和8之外的所有中断(参见维基百
有人能告诉或建议我如何使用masm32编写.com程序吗?
我曾尝试使用Exe2Bin命令将.exe转换为.com程序,但没有
祝你好运。每当我运行此命令时,请使用查看错误:无法转换文件。
有没有其他方法可以做到这一点?为什么不改用Nasm呢?Nasm很棒,但我认为有一种方法可以用Masm做到这一点。。。尝试.model tiny,或者在命令行上尝试/t。内存让我无法使用…这里有一些信息:.COM有几个严格的要求,其中一个要求是,正如@FrankKotler所指出的,在x86上使用最小的内存模型
我是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<->
如何在堆栈上放置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
我想开始学习汇编语言,但我不知道从哪里开始。我知道汇编依赖于处理器的体系结构。所以我现在有一个问题如果我在我的系统上编写一些汇编代码,它是否可能无法在另一台计算机上工作?如果不是,Windows或Linux是如何创建的,因此它几乎可以在所有计算机上运行。还是我错了?汇编语言是处理器的语言。不同的处理器,不同的语言
实现这一目标的方法有很多。用C编写然后在目标处理器上编译C程序是一种方法。使用虚拟机是另一种选择
某些可移植性是由具有类似指令集的同一系列处理器实现的。因此,英特尔和AMD处理器将运行
我的问题是它不能比较第一个数字是否大于第二个数字。。它只执行我打印字符串的部分
mov ah,9
lea dx,str1
int 21h ;Write string at DS:DX to standard output
mov ah,1
int 21h ;Read character from standard input into AL
sub al,30h ;al = character
我这里有一个代码,应该是:
听取意见
比较字母表中的每个小写字母“a”-“z”/97d-122d
比较当前字符是否相等输入:如果为真,则继续转换和回显
增量电流字符
比较计数器是否等于限制,同时不继续测试字符
如果在a-z中未找到,则显示无效输入消息并转到输入提示
这是我的密码:
.model small
.stack 100h
.data
Prompt db 10, 13, 10, 13, "Enter character: $"
Upper db 10, 13,
我用这段代码从键盘上获取输入,但我想不出一种方法来获取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
我正在尝试学习汇编语言,下面是我的教程:。我可以很好地组装代码,但是当涉及到链接.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编辑器
我需要帮助解释这行代码:
0x08048e26 <+43>: add 0x804a460(,%ecx,4),%edx
0x08048e26:添加0x804a460(,%ecx,4),%edx
我不确定这到底是什么意思。我将其解释为%edx=4*%ecx+0x804a460。但这似乎并不正确,因为在运行指令后,%edx从来没有包含我希望它包含的值。C中的等效值是
edx += *((int*)0x804a460 + ecx)
看起来它正在索引到一个静态表中以获取
我的任务是创建一个程序,将一些字符串写入文件。到目前为止,我想到了这个:
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。您必须首先创建文件(如果已经存在,则打开
我有ELF ARM EABI文件,没有源代码。它是二进制的.so文件
如何扩展文件段文本的大小
我知道这个二进制文件中的中断代码,但现在它不是问题。使用objcopy并调整LMA/VMA可能也必须对.text之后的部分执行此操作。或者,将.text提取到一个文件中,将其余部分复制到一个新文件中,然后将放大的.text添加回。
我对堆栈段(ss)和堆栈指针(sp)寄存器有点困惑。
堆栈为空时,sp值是否等于ss值?
我读到,当我们将一个字(2字节)推送到堆栈时,sp将递减2,如果第一个语句为true(sp=ss),那么我可以说,如果堆栈不是空的,堆栈指针的值总是小于或等于堆栈段的值,这是真的吗??。
如果我们影响sp的值,使其大于ss,会发生什么情况??即:
mov-ss,200h
mov sp,400小时
mov-ax,1010h
推斧
请纠正任何错误,thanx提前否,ss是一个段寄存器,与其他寄存器一样,如cs或
我比较了由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
我正在运行一个程序,要求用户输入要显示的复合数字的数量。例如,如果用户输入10,程序将显示前10个复合数字
我遇到的问题是,我的程序在一个长列中打印所有值,我需要让输出以每行10个复合数字显示,每行之间至少有3个空格。代码如下:
INCLUDE Irvine32.inc
.data
userInt1 DWORD ? ;integer to be entered by user
userInt2 DWORD ? ;integer t
我正在查看一些执行以下操作的库代码。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)
我正在大学学习汇编语言编程(80386编程)。目前,我正在学习使用EDX和EAX寄存器分别存储余数和商的32位除法的输入和输出。我想知道,为什么当我没有包含
mov edx, 00000000h
在我的节目里。程序要么不运行,要么输出错误
相关源代码:
mov edx, 00000000h
mov eax, 1234567Ah
div 11111111h ; now EDX=remainder, EAX=quotient
如果需要,我将发布完整的代码。32位div实际上将edx:eax除以指
我需要使用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位的数字,所以它存储
我正在编写一个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
我正在上一堂组装入门课,在最后一个项目中,我们必须制作一个播放“生日快乐”的程序
问题是,程序将歌曲播放到一半(到第13个音符),然后停止播放。我已经尽了一切努力来修复它,但我不知道为什么它不应该工作。我试着改变代码,改变循环的工作方式,改变哪些寄存器持有不同的值,但似乎没有任何效果。我查看了调试,没有发现任何异常。这是程序的代码:
;data segment
dseg segment para 'data'
;hex value for each note to send
我们很清楚有三种类型的中断:
内部中断
外部中断
软件中断
因此,系统调用是一个软件中断。二进制形式的MIPS SYSCALL指令为
0000000000000000000000 1100
当cpu获取该指令并执行该指令时会发生什么情况。在某些寄存器中,在该指令之前传递的参数在这里并不重要,关键问题是该指令本身做什么,它的工作是什么,它在cpu中如何工作
仅运行此指令对机器的体系结构状态有何影响?
这意味着,如果跳转到另一个内存位置(如中断向量表),受此系统调用(指令)影响的寄存器值、它打开的标
我想比较一个由100个数字组成的数组,然后从大到小打印它们。这是我正在使用的代码:
loop:
cmp r2, #100
bleq compNum
moveq r5, #0
ldr r0,=formatoF
bl scanf
mov r3, r1, lsl #1
str r2, [r3]
add r2, r2, #1
b loop
compNum:
cmp r5, #100
bleq fin
mov
做《实用恶意软件分析》一书中的练习(实验5-1)
全局变量dword_1008E5C4(第二张图片)应该包含OS版本,但从我看到的情况来看,由于
sub_10003695
我错过什么了吗
是的,setz指令,根据上面的比较结果设置al(eax的一部分)的值。该函数具有以下特征:
BOOL WINAPI GetVersionEx(
_Inout_ LPOSVERSIONINFO lpVersionInfo
);
因此,它在堆栈上的局部变量(此处引用了rel toEBP)中返回一个结构(或O
使用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
我使用带有集成汇编程序的IDE为一家公司的微控制器编写代码,该公司也生产我刚才提到的IDE和汇编程序。
因为带有硬件在电路编程器的开发工具包非常昂贵,我想对他们将编写的源代码组装成文件格式的方式进行反向工程,然后通过编程设备将其传输到控制器
所以基本上我所做的是编写一个非常基本的汇编程序(如下所示):
而且变化很小(像这样):
然后我看了一下生成的二进制文件。我所期望的甚至与实际发生的事情并不接近:
不只是一个字节改变了(我希望如此),而是总共2300个字节中的2000个字节改变了
可能实现这一
我在玩弄GCC汇编输出,尝试使用快速整数平均值。以下是我最初使用的C代码:
unsigned int average (unsigned int x, unsigned int y) {
return (x&y)+((x^y)>>1);
}
以下是它发出的程序集(使用英特尔语法):
当我为NASM翻译时:
average:
mov edx, edi
and edi, esi
xor edx, esi
shr edx, 1
le
由于某些原因,这实际上不会进入我的其他功能,如减法、除法等。当我将我的数字输入程序时,它会接受这些数字,并只打印出我存储在系统中的第一个数字。我可能需要修正我的控制结构也许?这应该是一个简单的计算器,需要两个数字和一个符号,并给出一个答案。我的另一个问题是,在我输入两个数字后,打印“=”号的最佳方式是什么。
谢谢
segment .data
segment .bss
num1: resb 4
num2: resb 4
button: resb 2
segment .text
glob
这个程序的要点是对用户提供的字符串进行base64编码,然后输出新的编码字符串
编码是通过从原始字符串中收集3个字符(每个字符为8位)然后将其拆分为4个字符(每个字符为6位)来完成的
如何正确访问和操作用户输入的字符串
目前,第一次迭代带来了正确的输出,但第二次迭代总是给t2值“0”,无论输入是什么,这将使用输出A停止程序;两者都是错误的
.data
sentence: .space 64
prompt: .asciiz "Enter the string: "
ASC: .byte 'A
标签: Assembly
picinstruction-setpic24dspic
下面是以下C代码的反汇编:
268: while (Counter < 250)
269: {
270: Counter++;
271: }
268:while(计数器
此程序集代码从引导加载程序进入受保护模式,但在调用远跳转并重新启动后,无法重置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
我正在验证一些输入;输入数字应介于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
当CPU处于内核模式时,它是否可以读取和写入任何寄存器,或者是否存在一些即使在内核模式下也无法访问的寄存器?在x86上,没有存储寄存器,因此所有寄存器在架构上同时可见
是的,在内核模式(环0)下,x86可以写入任何寄存器。(只要内核在64位模式下运行,否则它无法访问x/ymm8..16或zmm8..31或r8..r15)
是的,从64位用户空间进入内核后,可以切换到32位模式的内核;Solaris x86-64显然做到了这一点,并与32位内核驱动程序兼容。在内存小于4GB、缓存较小的机器上,在内
我正在写一个有两个参数的过程,一个是数字,另一个是数组的地址。我怎样才能为它编写原型?
我试着:
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)将需要相
我的任务是在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
MIPS汇编语言程序,以交互方式运行以在十进制、二进制和十六进制之间进行转换
请求输入数据类型
请求输入数据
请求输出数据类型
输出数据。使用任何算法
这是我作业的要求,我已经写了下面的代码,让我知道为什么它在运行时会掉下来
这是我的代码,请让我知道为什么它不能正常工作
#Provide data variable and data as an input and output
.Data
Input1: .asciiz "Kindly enter the input X:&q
我的主要源文件:
L0 LDR R0, =prompt
BL WriteString ;print prompt
BL ReadInt ;R0 = n
CMP R0, #0
BGE L1
LDR R0, =res0 ; invalid input
BL WriteString
B L0
L1 MOV R1, #2
L2 UDIV R2, R0, R1
MLS R2, R1, R2
这个问题基于计算机系统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不清楚使用什么指数偏差进行
我正在读一本关于汇编(中级)的书,书中提到一些指令,如xchg自动断言处理器锁定信号。在线搜索显示,它给予处理器任何共享内存的独占权,而没有具体细节。这让我想知道这个权利是如何运作的
这是否意味着任何其他计算机设备,例如GPU或其他设备,都不能访问内存。实际上,其他设备可以直接与RAM通信,而无需首先通过CPU
处理器如何知道它处于这种锁定状态?例如,它是否保存在控件或rflags寄存器中?或者什么,因为我看不到在使用多核CPU时该操作是如何工作的
我访问的网站说,锁定所有共享内存。这是否意味着