汇编语言中的指令
MOV A B
MOV D D
表示将B(源)的内容移动到A(目标)。
我突然想到了这个指示
MOV A B
MOV D D
这意味着什么
我在我的实验手册中看到了这一点。截图:
这是一种NOP操作,用于程序延迟。8085寄存器用于注册MOV指令是正交的。也就是说,存在将任何8位寄存器移动到任何其他8位寄存器的操作码。因此movd,D将D寄存器的内容移动到D寄存器。它不做任何有用的事情,也不影响任何标志,但它是一条有效的指令,就像mova、a、movb、B等一样
将寄存
我试图通过Visual Studio 2013(更新2)编译汇编代码,但收到以下错误:
C:\ProgramFiles(x86)\MSBuild\Microsoft.Cpp\v4.0\V120\BuildCustomizations\masm.targets(50,5):错误MSB3721:Der Befehl“ml.exe/C/nologo/Zi/Fo”Debug\inffas32.obj”/W3/errorReport:prompt/Ta“…\3rdParty\zlib-1.2.8\cont
使用OVPSim,我希望能窥视一下(模拟)MSR寄存器的内容
register int x asm("r19");
asm("mfs r19, msr");
printf("R19 contains %i\n", x);
这会产生以下错误:
Compiling application.c
/tmp/ccbSgUEu.s: Assembler messages:
/tmp/ccbSgUEu.s:59: Error: register expected, but saw 'msr'
/
在我的汇编类中,我被分配了一个任务,创建一个简单的程序,在给定用户输入的情况下查找球体的体积,我必须显示一条消息,后面跟着一个分数的体积。。。我已经提出了以下代码,但不幸的是,我被余数的去向以及如何调用它们所困扰。有人知道我把事情搞砸了,我该怎么解决吗
INCLUDE Irvine32.inc
.data
radius byte 0
prompt byte "Please enter the radius of the sphere~ ", 0
volumeMessage byte "The
我想的是将堆栈指针设置为函数,然后执行直到返回
编辑:我使用nasm和nlink
Edit2:我使用x86处理器
Edit3:好的,我想写一个过滤函数,它会过滤一个字符串,使用另一个函数来决定一个字符是否可以接受。我想象它的形式是:
;params: string in r1, function in r2
Filter:
;do stuff
ret
IsCharGood:
;decide if char is good
ret
main:
mov
我需要读取并显示作业的文本文件。基本上,它需要读取并显示名为“textfile.txt”的文件中的文本。在EMU8086中,我知道将文件放在哪里,程序运行良好。然而,在DOSBox中,我不知道“textfile.txt”放在哪里
当我运行这个程序时,它什么都不做
.model small
org 100h
.data
.code
org 100h ;.com memory layout
;****FOR EMU8086: PLACE THE FILE named "textfile.txt"
正如在这个问题的标题中提到的,当我出于临时原因修改asm语句中的一些寄存器时,在clobber和dummy输出之间,哪个选项更好
例如,我在中实现了两个版本的exchange函数,发现两个版本生成的输出指令数量相同
我应该使用哪个版本?我是否应该使用带有伪输出的寄存器来允许编译器选择尽可能优化整个函数的寄存器
如果答案是肯定的,那么我应该在什么时候使用clobber列表?只有当一条指令要求您将其操作数加载到特定寄存器时,才可以使用clobber列表吗?如syscall指令要求其参数应位于寄存器r
我主要对流行和广泛使用的编译器感兴趣,比如gcc。但是,如果使用不同的编译器执行不同的操作,我也想知道这一点
以gcc为例,它是将一个用C编写的短程序直接编译成机器代码,还是先将其翻译成人类可读的汇编程序,然后才使用(内置的?)汇编程序将汇编程序翻译成二进制机器代码——一系列给CPU的指令
使用汇编代码创建二进制可执行文件是一项非常昂贵的操作吗?还是说这是一件相对简单和快速的事情
(假设我们只处理x86系列处理器,所有程序都是为Linux编写的。)编译器通常将源代码解析为抽象语法树(AST),然
各位Stackoverflow用户好,
我正在尝试用MIPS编写一个实现时钟的代码。我正在构造自己的异常处理程序,但我做了一些错误的事情,因为目前我只显示00:00。所以我使用一个标志来决定它是否是一个时间中断,但是这个标志从来没有设置为一个,我看不出为什么不是。如果有人看到我的错误或我对这个概念的巨大误解,请告诉我
这是我的代码:
.globl __eoth
__eoth:
.globl Yesdisplay #flag to indicate if a second p
如果我将程序集文件的大小写从.s改为.s,那么使用android-ndk-r5b的OPenssl在使用cygwin的Windows上可以很好地编译
然而,在Linux(Ubunti 10.0.4)上,使用相同版本的NDK,我得到以下错误
make:*没有规则使目标externals/openssl-0.9.8h-android/crypto/0.9.9-dev/bn/armv4 mont.S',符合obj/local/armeabi/objs/crypto static/0.9.9-dev/bn
我正在编写一个使用LLVM作为后端的程序,我的编译器生成以下LLVM汇编代码
@0 = private constant [25 x i8] c"Hello World to %dntegers\00"
declare void @printf (i8*, i32)
define void @main () {
%1 = getelementptr [25 x i8]* @0, i32 0, i32 0
%2 = 1
tail call void @printf(i8* %1,
我在破译这段汇编代码时遇到困难。到最后r1的值是多少?我如何才能达到这个值
3242ba66 f6454118 movw r1, 0x5c18
3242ba6a 466f mov r7, sp
3242ba6c f6c0415a movt r1, 0xc5a
3242ba70 f2460002 movw r0, 0x6002
3242ba74 f6c0405a movt r0, 0xc5a
324
我不能在火星上使用li.s。我是MIPS编程的新手,我尽量不使用任何协处理器。为什么我不能使用li.s。MARS是程序吗?如果有人能带领我走向一个新的方向,那将是非常有帮助的 这是一条伪指令,可能没有在mars中实现。可以使用li(ori)和mtc1的顺序
这会将值1.234加载到$fp1,并在MARS中工作:
li $t1,0x3f9df3b6
mtc1 $t1,$f1
十六进制或整数值可以使用或使用简单程序找到(在Fortran中,在C中类似于使用指针转换):
使用伪指令l.s和存储在数据
我试图了解汇编语言如何适用于微型计算机体系结构类,在示例中我一直面临不同的语法:
sub $48, %esp
mov %eax, 32(%esp)
这些代码是什么意思?esp寄存器中添加的32个操作数是什么?这不是英特尔语法,也称为
$前缀用于立即数(常数),而%前缀用于寄存器(它们是必需的1)
有关AT&T语法的更多信息,请参见
1除非指定了noprefix选项,否则请参阅&。但通常,noprefix仅与一起使用。英特尔语法noprefix,以获得类似MASM的语法。正如@Necrolis
假设我在r0、r1和r2中有三个uint32_t值;假设我有一个常量shift在[0,32]
下面是我需要执行的C代码:
uint32_t rx = (r0 >> shift) | (r1 << (32 - shift));
uint32_t ry = (r1 >> shift) | (r2 << (32 - shift));
如果移位是8位还是24位呢?
基本上,我有一个未对齐的指针,我需要从这个未对齐的指针中读取单词。首先,我想清除两个最低有
假设我有一个浮点数123.4567。。。在$f0寄存器中
如何将其舍入到123,46并存储到$f1注册表
我需要一个同样适用于负数的解决方案:
-123.4567…-->-123.46
编辑。还有整数:
-4.0-->-4.0伪代码:
Multiply by 100.0
If sign is positive
Add 0.5
Else
Subtract 0.5
Convert to integer
Convert back to float
Divide by 100.0
伪代码:
M
基本上,在68000汇编语言中,要对地址寄存器进行后增量,您必须执行以下操作:
(A0)+
范例
MOVE (A0)+,D0
这将移动到D0地址所指的A0值中,并将A0增加1
考虑到(A0)是A0所指的值,如果后增量语法为:
(A0+)
??或者我错过了什么
MOVE.L (A1)+,D0 ; increments A1 by 4, because it is long operation
; and 4 is size of long
我认为当前的pos
如果我在堆栈框架内插入新的函数和指令来组装x86代码,是否有必要增加堆栈大小?如果是的话,多少钱
sub 0x4, %esp
push %eax ;;new instruction
...
call fun ;; new inserted function
pop %eax ;;new instruction
.....
add 0x4, %esp
是管理如何调用函数、传递和返回值以及如何管理
我设法编写了一个接受32位整数并将其转换为数字数组的代码,以在另一个数字系统中表示它
问题:如何将其扩展到64位?
在数字Mars C/C++编译器中:
void get_digits_asm()
{
__asm
{
pushf
movd xmm0,eax
movd xmm1,ebx
movd xmm2,ecx
movd xmm3,edx
movd xmm4,edi
当我编译这个文件时,它说:
错误:符号“dseg”未定义
怎么了?如何调用cseg的偏移地址?请尝试以下方法:
section dseg
bits 16
gdt:
code_descriptor:
.......
section cseg
bits 16
start:
mov ax, seg dseg
你不能简单地跳转到dseg的偏移量吗?尽管如此,还是要谢谢你,但它再次显示“symbol'dseg'undefined”。你如何汇编代码?确切的命令是什么?您使用的输出
我编写了一小段代码,并使用gcc-S对其进行编译,以查看ASM输出:
...
movl %esp, %ebp
.cfi_def_cfa_register 5
subl $16, %esp
movl $0, -4(%ebp)
...
现在,我希望在Linux上调用objdump-D(反汇编)可以得到一个等效的结构,但它看起来像:
80483b5: 89 e5 mov %esp,%ebp
80483b7: 83 ec 10
我正在努力学习汇编语言emu8086。我目前正在尝试学习循环。我将发布的所有问题都是出于个人好奇心。首先,我输入要输入的值的数量。问题是我试图使用循环输出来显示我使用输入循环存储在bx中的值。由于某种原因,我的输出循环不工作。请帮忙
include 'emu8086.inc'
.mo
我在ollydbg中遇到了这样一行
edi是FFFFFF
test edi,edi
jl short
调试器声明跳转被执行,据我所知,测试执行数学AND运算,但ffffffff和with ffffffff仍然是ffffffff。我想知道的是,结果是如何解释的,JL是一个有符号的跳转,当它表示如果小于跳转,它是否会引用到小于零的值?既然FFFFFF=-1签名,我希望你们能明白我的意思,edi寄存器对自身进行测试会得到相同的精确结果,那个么它是如何减少 此代码正在测试符号位(最高有效位)是否已设置
您好,我是avr asm编程新手,在下面,我有几个问题:
1) 标签是8位还是16位长
2) 为什么需要带2的乘法标签
3) 指令LPM正在将其结果放入寄存器R0?如果是这样,那和Z有什么关系
4) 您能否从提供的链接中解释引用的文本:
“如果地址不乘以2,且标签位于字节地址0x60(字地址0x30),Z将指向存储在那里的代码。我希望这澄清了寻址问题。其他版本为”
谢谢
标签是16位
因为汇编程序使用的是字地址,但是LPM需要字节地址。请注意,并不是所有的汇编程序都这样做,尤其是avrgc使用的
我将应用程序中的一些数据发送到一个php文件,该文件可能会在屏幕上打印3种不同的内容(如果我在浏览器中打开它),我将一些内容发送到我的URL,如下所示:
sendtourl PROC
_loop:
invoke lstrcpy,addr _urlTmp ,addr _url
invoke lstrcat, addr _urlTmp , addr lpszNumber ;----- add parameter to url
invoke InternetOp
我正在尝试将一些汇编代码反向工程为C。我有以下汇编代码位,我正在尝试解密:
lea 0x1(%rbx), %eax
add 0x0(%rbp, %rbx, 4), %eax
cmp %eax, 0x4(%rbp, %rbx,4)
我逐行解释如下:
%eax=%rbx+1
%eax=%rbp+4*%rbx+0
将%eax与%rbp+4*%rbx+4进行比较
我知道六次迭代中的前三次分别产生1、2、4,但我不知道是什么公式产生这些值。有人能告诉我在破译这个时是怎么出错的吗?你必须看到第二行和第
我很好奇-在定义常量时,ARM汇编中的.eq和.word指令之间有什么区别?.word是在该位置分配单词大小的存储空间(内存)的指令。它还可以使用给定值初始化该位置
.eq更像是一个C预处理器#define语句——它在任何后续代码中都会被替换
这实际上不是特定于ARM的,但适用于所有气体目标。.eq类似于C中的\define:
#define bob 10
.equ bob, 10
unsigned int ted;
ted:
.word 0
.word类似于C中的无符号int:
#d
执行以下指令后,DX和AX的十六进制值是多少
mov dx,-32
mov ax,4
imul dx
-128=128=2^7=1000 0000=0000
2的赞美语,将正数变成负数
1111111100000
我不知道如何从这个数字中得到Dx和Ax的十六进制值。非常感谢您提供的所有帮助。由于您使用的imul生成的是32位有符号结果,因此您应该使用32位算术。因此,完整值为11111111111111111111111111000000。前16位进入DX低16位进入AX。我相信您从二进制转换
我对汇编代码非常陌生,需要知道如何将命令行参数(argc、argv、env)作为函数参数传入。第2行(#就在这里)是我不知道实现的地方,我需要将这三个参数传递到我的main中。有人能帮忙吗
我通过运行:gcc-m32 t.c s.s来编译它。下面的代码是s.s,mymain是t.c
main:
#RIGHT HERE
call mymain
ret
您必须了解32位linux ABI(应用程序二进制接口),它描述了传递参数和堆栈使用的调用约定。我不打算在这里
我正在读《专业汇编语言》一书。
我想使用动态链接
我在GNU汇编程序中使用AT&T语法。
我的电脑有Ubuntu 12.04(64位系统)。
我正在尝试使用cpuid汇编程序操作码和显示供应商ID字符串
printf C函数而不是linux系统调用。
代码hello.s
.code32
.section .data
output:
.asciz "The processor Vendor ID is '%s'\n"
.section .bss
.lcomm buffer
我喜欢用C子程序包装我的asm。像这样:
void foo()
{
__asm__("op R0, R1");
...
__asm__("op R1, R4"); /* last instruction */
}
当我这样做时,有时会出现调度错误,代码崩溃。在纯ABI兼容ASM中编写子例程时,有时会导致C代码的其他部分无法正确运行,但不会崩溃
我能做些什么来帮助/使GCC防止调度错误。您不能假设编译器生成的代码不使用寄存器;或者编译器知道内联程序集的功能。注意:对
我试图使用一个指令集编写这个表达式A=(B×(C+D×(E×F))÷(E×(C+D)),其中每条指令都没有操作数(两条指令必须各有一个操作数除外)
这是我所遵循的书中的一个例子:表达式是z=x*y+w*u
守则:
PUSH x
PUSH y
MULT
PUSH w
PUSH u
MULT
ADD
STORE z
我所做的:
PUSH E
PUSH F
MULT
PUSH D
MULT
PUSH C
ADD
PUSH B
MULT
STORE Z (store the result)
PUSH
我正在回顾Visual Studio 2012中一些程序的反汇编,并看到以下内容:
65F920F3 or eax, 0FFFFFFFFh
65F920F6 jmp 65F92157
注意或。它占用地址F3-F5,这意味着它只占用三个字节。eax寄存器是四个字节,因此我假设常量0ffffffh也是四个字节
此指令如何适合三个字节?因为常量0xFFFFFFFF aka-1适合有符号字节,所以它可以使用有符号字节的编码作为立即操作数
那就是
83 C8
是否可以通过启用A20在真实模式下使用4GB ram,而不切换到保护模式,也不丢失BIOS中断?您可以通过使用非真实模式来实现这一点。此模式使用限制为4 GB的选择器加载一个或多个段寄存器。这种模式有两种形式,大虚幻模式和大虚幻模式。前者允许访问超过1MB的数据,后者允许访问超过1MB的代码和数据。但是,很难设置巨大的非真实模式,因为真实模式中断只保留EIP的低16位。有关更多信息,请参阅
如果可能的话,您可能还需要从BIOS获取内存映射,因为有些内存是映射到特定硬件的内存,不能用作普通内存。有
我认为错误在循环中或某个地方
我这样做是对还是错?循环0107显然被认为是一个绝对跳转,只是一个偏移量,但是循环只能在-128-+127字节的距离上执行相对跳转。此处此指令的机器代码为e2ee,意思是:“从此处向后跳回16字节”(更准确地说:“从下一条指令向后跳回18字节”)。您可以编程此:循环$-16$代表“here”,因此$-16是“here减去16字节”=“从这里返回16字节”。您必须考虑此指令必须保持在完全相同的位置,并且强>不能< /强>插入代码之前,否则“来自这里的16个字节”将不会
在windows 7 32位上执行此操作时出错:
SECTION .data ; data section
msg: db "Hello World",10 ; the string to print, 10=cr
len: equ $-msg ; "$" means "here"
; len is a value, not an address
SECTION .text ; code section
globa
假设您有一台Pep/8类型的计算机和以下磁盘文件:
文件A:用机器语言编写的Pep/8汇编语言汇编程序
文件B:用汇编语言编写的C++到汇编语言编译器
文件C:一个C++程序,它可以读取数据文件中的数字并打印其中值
文件D:文件C中值程序的数据场
要计算中值,必须进行图5.28所示的四次计算机运行。每次运行都涉及一个输入文件,该文件将由程序操作以生成输出文件。一次运行产生的输出文件可用作输入文件或后续运行的程序。描述文件E、F、G和H的内容,并用适当的字母标记图5.27中的空块
图5.28
我的意思是,我知道test实际上与操作数有关,但在这种情况下它在做什么?testl后面一行中的jle说明了会发生什么:如果esi为非正(0或更小),请在阅读文档时跳到.L7(这是什么处理器)这两个指令说明了什么。特别是关于旗帜?答案就在文档中。
testl %esi, %esi
jle .L7
如何在汇编中乘法浮点?
我在ebx中有一个值,并且希望将其乘以0.65
mov eax, ebx
mov ecx, 0x0.65 ;; how do this?
mul ecx
mov ebx, eax
要将输入视为有符号还是无符号?如果它是有符号的,那么转换为double并返回实际上是简单而快速的(使用SSE2):在insn set ref中查找CVTSI2SD/MULSD/CVTSD2SI(标记wiki中的链接)
它实际上可能比在现代CPU上使用整数IDIV快,但可能比编译器用编译时常量1
我对汇编语言一无所知。我试图制作一个简单的程序来破译凯撒密码。问题是,链接后我会出现以下错误:
cezar.o: In function `loop':
(.text+0xbf): relocation truncated to fit: R_X86_64_8 against `.data'
cezar.o: In function `check_letter':
(.text+0xd5): relocation truncated to fit: R_X86_64_8 against `.d
我对大会上发生的事情有点困惑。我可以看到基本情况,如果不输入六个数字,炸弹就会爆炸并结束程序。逐行检查输入,如果六个数字不是负数,则进入循环。我在这里迷路了0x0000000000400f29:add-0x4(%rbp),%eax
这看起来很简单,但我真的不明白这里添加了什么。是否将-4相加,然后将其与0进行比较?如果相等,那么跳跃
我基本上是在寻找关于循环的澄清,以及什么样的输入模式将在循环中继续
转储
0x0000000000400f0c <+0>: push
我怎么才能得到一个我根本不懂,也没有找到一个简单例子的输入和输出呢
我唯一拥有的是:
我正在visual studio中使用masm
; get a write handle
MOV rcx, STD_OUTPUT_HANDLE
CALL GetStdHandle
MOV whandle, eax ; write handle
; get a read handle
MOV rcx, STD_INPUT_HANDLE
CALL GetStdHandle
MOV
我正在学习8086,有一个特别的问题困扰着我,我还没有找到任何满意的答案
我知道CPU按顺序执行代码,如果要更改代码流,我们希望IP指向我们感兴趣的代码所在的新/旧地址
现在,我的问题是,当我们遇到跳转指令时,为什么我们(我指的是CPU)不只是去用与标签对应的地址更新IP
当我们遇到跳转指令时,需要在IP中添加位移吗
在我看来
计算位移(即从跳转标签到跳转后下一条指令的距离),以及
然后接受2的赞美
它最终被添加到IP,以便IP指向标签所指向的地址/指令
对我来说,这听起来像是更多的工作,然后只
我必须使用ARMV7做一个例程,它在RAM内存中存储10个二进制数,然后使用冒泡排序将这些数从高到低排序,我应该如何开始
.func
bubbleSortAscendingU32:
ldr r3, [r0], #4
mov r1, #9*4
mov r12, #9*4
1:
ldr r2, [r0], #4
cmp r2, r3
strdlo r2, r3, [r0, #-8]
movhi r3
我的NASM程序有问题。目前我正试图连接两条线。
这很好,但是当我在第15行写:mov-rsi,msg2而不是mov-rsi,30h时程序会输出奇怪的输出,我不知道为什么
控制台上的第一个打印窗口是mov rsi,msg2,第二个是mov rsi,30h
控制台输出:
simon@simon:~/Projekte/NASM$ bash ./run.sh
Ich verbinde mich mit �`
simon@simon:~/Projekte/NASM$ bash ./run.sh
Ich
我有一个测验代码,最后给出正确答案和错误答案的数量。为了计算不正确的问题,我用正确的问题减去问题总数。但在输出中,错误答案的数量会重复两次
我无法在代码中找到错误,即使我单步通过调试器。
我在火星上运行这个
.data
Q1: .asciiz "Q1) What is the capital of Odisha?\n1) Chennai\n2) Bhubaneswar\n3) Cuttack\n4) Delhi\nAnswer:"
Q2: .asciiz &q
我正在编写一个旧的MCU(68hc11),我正在尝试使用68hc11指令从C语言迁移到汇编代码
我想在汇编中编写一个程序,计算给定数组中存在的正值、负值和零值的数量。请注意,数组中的所有值都可以是正数、负数或全零,明白吗?因此,我应该定义变量的大小,以便正确地存储数量
注意:数组的结尾是:数组+数量-1
数组:包含一些随机值
数量:表示数组可以包含的最大元素数
持有
我用C编写了这个程序:
int A[15], pos, neg, nul, i;
[...]
pos = 0;
neg = 0
我试图在DOSBox上的assembler中设置VGA(640x480x16)调色板,但具体来说,颜色6、8-F不会改变。我尝试过使用中断和直接通过端口,这两种方法都适用于其他颜色,但不适用于那些颜色。我在默认配置中使用DOSBox 0.74-3。这是我的密码
setpalete MACRO index,r,g,b
mov ax, 1010h
mov bx, index
mov ch, r
m
如果数据输入端口A=08H,则数据输出端口B=0FH;如果数据输入端口A=80H,则数据输出端口B=F0H,除此之外,输出端口B=00H
这是我的密码
LD A, 4FH
OUT (82H), A
LD A, 0FH
OUT (83H), A
LOOP: IN A, (80H)
CP 08H
JRNZ STATE1
LD B,0FH
我是初学者,所以这段代码可能不太好,我用了int16h来做这段代码,但我对这段int不太了解。我刚发现你不可能一次击多个键;有什么帮助吗?
这个代码的问题是一次只能移动一块板,我需要两块板。如何检查多个输入
以下是所有想要它的人的代码:
这个代码的问题是一次只能移动一块板,我需要两块板
同时性的感觉来自于快速,真正的快速。计算机中的大多数东西都是连续工作的,但我们认为许多事情是并行发生的
你的支票代码很好。一块板使用q键和s键,另一块板使用向上键和向下键。
一旦有键可用,键盘BIOS功能00h将