我正试图用MIPS汇编语言使用
我现在的主要问题是如何初始化一组内存位置,以便以后可以通过汇编语言指令访问它们
例如,我想用值0x99、0x87、0x23、0x45初始化地址0x1001000-0x1000003。我认为这可以在我的汇编程序的数据声明(.data)部分完成,但我不确定语法。这可能吗
或者,在.data部分,我如何指定将整数值存储在某个内存位置(我不关心在哪里,但我只想在某个地方引用它们)。因此,我正在寻找C等价物“intx=20,y=30,z=90”;我知道如何使用MIPS指令来
我在汇编语言中遇到了一个问题,我无法访问数组的元素。。。假设一个数组包含星期天。。。像太阳、周一、周二、周三。。。。我必须访问数组的第二个索引。。。如何实现这一点?汇编中的索引与C/C++基本相同,只是有一个区别:您必须知道数据元素的大小
例如,要循环汇编中的字节数组(或字符串中的字符),可以执行以下操作:
mov eax, 0
mov ecx, 0
loop_start:
cmp ecx, ARRAY_LENGTH
jge loop_end
add eax, BYTE PTR
我正在使用llvm clang编译器,在ARMv7-A处理器上将简单的C函数编译成汇编。我试图弄清楚这条指令的作用
SUB sp, sp, #65, 30
显然,它在堆栈指针上为一些局部变量腾出了空间,但我从未见过有四个操作数的ARM子指令。我猜30在某种程度上修改了#65,但我不知道如何修改,我也无法在ARM架构参考手册中找到详细信息。有什么建议吗
出于好奇,这是创建8 x 8整数单位矩阵程序的开始,因此我希望sp需要为堆栈上至少8 x 8 x 4字节留出空间。30是65上的右转操作
向右旋
我的代码如下所示。我找到了用于读写的rmb和wmb,但没有找到通用的。lwsync在PowerPC上可用,但x86的替代品是什么?提前感谢
#define barrier() __asm__ volatile ("lwsync")
...
lock()
if(!pInst);
{
T* temp=new T;
barrier();
pInst=temp;
}
unlock();
rmb()和wmb()是Li
我知道我可以使用IRQ0,这是系统计时器,但这是基于14.31818MHz的时钟,对吗?有没有更精确的方法
谢谢
编辑:有人知道Windows函数QueryPerformanceCounter使用什么吗?英特尔处理器通常通过指令提供高精度计时器信息
它的精度远高于14MHz。需要注意的是,它可能会在多核和速度步进处理器上出现问题
编辑:有更多关于这个主题的细节
1.实际频率取决于处理器,但通常是处理器频率。显然,在Nehalem处理器上,TSC以前端总线频率(133 MHz)运行。
“精确”
假设变量I被定义为Qword,则方程I=2*I可使用以下最低指令实现:
解决方案:
MOV EAX, DWORD PTR I
ADD DWORD PTR I, EAX
我不明白的是
MOV EAX, DWORD PTR I+4
ADC DWORD PTR I+4, EAX
X86是一种体系结构。这意味着数字首先以最低有效字节存储
例如,0x1234以0x34字节后跟0x12存储在内存中。维基百科的文章还有很多,但我会很快总结:
Memory location: X X+
我是一名工科学生,对这个项目有点困惑。有人能帮我填写程序中每行的剩余注释吗?我是这个节目的新手
#INCLUDE<P16F88.INC> ; PIC definitions
SET_UPPER EQU 0x20
SET_LOWER EQU 0x21
READ_UPPER EQU 0x22
READ_LOWER EQU 0x23
P_gain EQU 0x24
I_gain EQU 0x25
D_gain EQU 0x26
Prop
为什么DS和ES寄存器的初始化必须由程序员手动完成
例如:
MOV AX, DTSEG
MOV DS, AX
另一方面,CS和SS寄存器由操作系统初始化(在MS-DOS中)。为什么会这样?因为与指向用户定义数据段的DS和ES寄存器相比,CS和SS寄存器对于程序执行是必不可少的。默认情况下,执行程序中不存在任何数据,因此不需要初始化DS和ES。作为程序编写器,您可以通过设置数据段寄存器来指定数据的位置
编辑:正如@FrankKotler正确指出的那样,在.com文件中(整个程序大小不超过单个段)
我正在编写一个程序,使用中断处理在MIPS中玩一个基于ascii的游戏。我被告知从我的处理程序“长时间调用”我的主函数。我的处理程序发生在.ktext 0x8000180下,如下所示:
.ktext 0x80000180
move $k1, $at
beq $13, 0, keyboard
li $v0, 10 # Do nothing and exit
syscall
keyboard: # else check interupt lev
例如,如果我按下ax,[SP]是否指向我的ax值或ax后面的单词?它是否与实际模式和保护模式不同?我之所以这样问,是因为《汇编艺术》一书以sp指向上次推送的数据为例进行了说明,而在本页上,它以指向上次推送数据后的空单词为例进行了说明。维基百科说:
堆栈通过隐式递减(push)和
递增(pop)堆栈指针。在16位模式下,此隐式堆栈
指针地址为SS:[SP],在32位模式下为SS:[ESP],在
64位模式,它是[RSP]堆栈指针实际上指向最后一个
在假定其大小匹配的情况下存储的值
处理器的操作模式
不幸的是,我在一个二进制文件的一个数据部分上点击了“C”,我做了很多工作,并保存了它,因为我还有很多工作没有保存。我尝试将这个巨大的部分转换回数据,但每当我选择行并按“D”时,只有光标所在的行被转换为数据
因此,我的问题是,如何在IDA(特别是6.1)中将大量数据标记/转换为代码
(如果需要的话,目标体系结构是ARM)。您可以使用快速的Python脚本,例如输入:
for a in xrange(startaddr, endaddr): MakeCode(a)
进入输出窗口的“Python”字
这段代码应该检查字符串是否为palindome
但对于任何字符串,它都会打印“是”。我如何解决这个问题
我认为错误在某些跳转指令中
错误是什么
include inout.asm
.model small,c
.stack 200h
.data
pal db "rear"
;pal db 200 dup("mohammad")
pal_len equ $ - pal - 1
szYes db "yes$"
szNo
我有一个任务,要构建rop代码,它调用printf,值在edx寄存器中
我卡住了。我知道printf函数的地址,我有一个查找小工具的工具
我正在尝试构建一个类似以下内容的堆栈:
someROPCode、printf_地址、ret_地址、写EDX_值的RopCode(printf参数)
我尝试了:someROPCode=addesp0xc,ret(跳过printffunc,这样我就可以在堆栈上写入edx值)
ROPCodethattwrite_EDX_Value=我考虑过这样的事情:push ea
我不擅长在汇编中编写代码,我只需要在汇编中编写这个,不管怎样,这就是我正在尝试做的。(我正在使用Masm32)
正如您所看到的,每个字符或字节用空字节分隔,它只能显示一个字节,“1”而不是“123”
如果我能连接每个可读字节,直到它到达字符串的末尾就好了
mov ebx, offset Msg
mov ecx, ebx
add ebx, 2
invoke lstrcat, ebx, ecx
可能还会添加一个循环,我只是不知道更好的编码方法,或者您是否有更好的解决方案可以共享。为了处理字符串,您
我正试图写一个程序,对两个32位的数字进行加法和减法,并将和和和差存储在内存中。我没有任何输出,只是通过调试器获得结果
这是我的密码
;---------------------------------------------------------;
;**********************************************************
STACK SEGMENT PARA STACK 'STACK'
DB 64 DUP('STACK')
实现转换字符串中小写字母的toUpper函数
大写。该函数接受一个参数:char*string。字符串是一个
char类型指针,指向字符串的开头。因为C-
样式字符串以零结尾,我们不需要取
字符串作为另一个参数
我需要帮助开始,我不知道我在做什么
void toUpperchar*字符串{
__asm{
推送EAX
推EBX
推ECX
推式EDX
推动ESI
推式电子数据交换
MOV EBX,字符串
/*您的代码从这一行开始*/
/*您的代码结束于此行上方*/
流行电子数据交换
波普ESI
波普
在kip irvine的《汇编语言》一书中,他谈到了标签指令,并说了以下声明
在下面的示例中,我们声明
val32前面的一个标签命名为val16,并为其提供一个WORD属性:
.data
val16 LABEL WORD
val32 DWORD 12345678h
.code
mov ax,val16 ; AX = 5678h
mov dx,[val16+2] ; DX = 1234h
val16是与val32相同的存储位置的别名。LABEL指令本身不分配存储。
我的问题是val16怎么能
我正在学习MIPS assembly中的数据依赖关系和数据危害,我有点不确定哪些类型的依赖关系会导致危害。我举了一个例子:
add $2, $1, $5
sub $7, $2, $3
lw $4, 8($7)
add $6, $4, $3
3美元的依赖不应该造成危险,对吗?
7美元的依赖关系是通过转发来解决的,还是需要暂停?是的,不需要,这很简单,只要尝试一下,你就会明白=
PS:我的答案适用于常规的5阶段管道,因为你说你是初学者,那么我假设这就是你的意思你的MIPS管道是什么?
我这里有这段代码,但我不熟悉语法
STACK16_SIZE = 100h
stack16 db STACK16_SIZE dup (?)
我认为dup意味着我们声明了一个数组类型的变量,因为这是一个堆栈,但我不确定。那么,在TASM中,dup到底意味着什么呢?STACK16_SIZE dup(?)意味着将括号中的数据复制STACK16_SIZE倍。它相当于写?,,,,,,,,。。。(100小时次)
parens中的数据为“未初始化数据”。也就是说,内
以下面的代码为例:
void calculate(int int_number) {
__asm {
fld1
mov eax, 5
fidiv eax ; A
}
}
如果我试图编译它,A行将失败,出现错误C2415:操作数类型不正确。如果我用整数常量替换eax,同样的问题也会发生。但是,如果我将int_number作为fidiv参数传递:
void calculate(int int_number) {
__as
我正在开发一个程序,它使用8086汇编中的目录
我正在搜索一个代码来更改目录,就像终端上的“cd”命令一样 如果要更改emu8086.exe文件路径(假设已将当前exe文件从d:drive更改为c:drive),请在cmd上使用以下命令
setx路径“%path”;c:\emu8086
但是您必须删除旧路径这有帮助吗?是的,非常感谢。我已经解决了这个问题。
我在汇编emu8086 emulator中有以下几行代码:
mov al,00100000b
ror al,8
当al等于0000 0001时,两个标志进位和溢出被关闭,
但是当al等于1000 0000时,这两个标志被打开
进位标志正常-最后一个数字1在标志中,但为什么此操作也会打开溢出标志
谢谢你的帮助 来自
OF标志仅为1位旋转定义;在所有其他情况下(RCL和RCR指令除外)未定义
仅限:零位旋转不起任何作用,即不影响任何标志)。对于左旋转,OF标志设置为异或
CF位(旋转后)和
例如,我想写一些类似于'a'的东西,而不是像在C中那样写0x61
手册在中提到了它们:但是没有一个例子,我不确定我是否理解
/* Immediate. Without the `$`, does a memory access, and segfaults! */
mov $'a, %al
/* al == 0x61 */
/* Memory. */
mov c, %al
/* al == 0x62 */
c: .byte 'b
/* Space character works. */
m
我无法同时找出bitshift和ldr的正确语法…以下是我一直在尝试的内容
ldr r4, r1, lsr #1
我想把r1除以2,然后以一个快速的运动将它存储在r4中。然而,gcc在指令后面说垃圾。mov是用于将一个寄存器移动到另一个寄存器的合适指令,而不是ldr
ARM模式下的语法为:
mov r4, r1, lsr#1
在拇指模式下,您可以执行以下操作(如果正在使用,也可以在手臂模式下工作):
ARM是一种具有单个ld/st单元的加载/存储体系结构。除了地址的自动inc/dec,您不能
我正在尝试在Bochs中启动自定义内核。然而,当我尝试运行它时,Bochs会在几秒钟内生成数十万条到终端的输出线。它们都包含相同的消息:
00017895741e[CPU0 ] read_virtual_checks(): read beyond limit
我正在使用由dd if=/dev/disk3s1 of=Boot.img创建的映像,其中disk3s1是Mac的DMG安装驱动程序使用的原始设备。(此图像在QEMU下引导正常,但由于我的内核和QEMU之间不兼容,我现在必须使用Bochs
我正在尝试调整(减少)一个8位灰色图像的大小,调整系数为36=6x6。我想使用ARM霓虹灯说明。我的代码如下所示:
//I deinterlace 3 8-pixel on the first line (named line0) and
//I add them. So I have resized horizontally by a factor 3
//Line 0
vld3.u8 {d0, d1, d2}, [line0]!
vaddl.u8 q3, d0, d1
vaddw.u8 q3
(查找大于20的8位整数数组中的元素总数,使用for-loop-looping构造)我正在用汇编语言编写代码,不知道如何完成家庭作业。我有一个基本的大纲,只是不知道如何为这个设置floop。(avr组件)
计数器:
.equ as=10
.def loopcount=r16
.def计数=r17
.cseg
.org 0x00
jmp启动
.org 0xF6
开始:
ldi ZL,low(array一个好主意是首先用高级语言写出循环,然后将其转换为asm。我喜欢使用伪代码,有些人编写一些实际编译
我在学组装。我在用背景色(黄色)打印“Hello World!(红色文本)”时看到了这个示例
我设法编辑代码,通过反复试验,只打印黄色背景的空格。但是我不能打印新的行。如果我添加一个新的mov[200],''例如(不知道这是否正确),它会在不同的行上添加一个字符,但颜色不同。。如果我在逗号后添加00010001b,则if打印的颜色应为蓝色
有人能给我一个关于这段代码的入门教程吗。我现在只想再打印一行。。这是到目前为止的工作代码。。它打印出一整行黄色
name "hi-world"
; hex
我试图将两个数组细分以创建第三个数组,但当我尝试将它们细分时,AX寄存器得到的值与原始值完全不同。
在第一小节中,正如您所看到的,我试图将数字2082(822h)移动到AX,但在TD中,它显示AX得到了类似32849(8052h)的值。怎么了???谢谢
.MODEL SMALL
.STACK 100h
.DATA
ARR1 DW 333,20989,3456,2082
ARR2 DW 333,15,5436,2082
ARR3 DW ?
ANSWER DB 'The last dig
我正在尝试将十六进制转换为十进制,同时移动并保留符号。让我的'simm'变量正确反汇编签名指令时出现问题
void disassembleInstr(uint32_t pc, uint32_t instr) {
uint32_t opcode; // opcode field
uint32_t rs, rt, rd; // register specifiers
uint32_t shamt; // shift amount (R-type)
我正在尝试为计算器编写一个简单的编译器。然而,我的所有汇编指令(加法、减法和乘法)在2147483647和2147483647处不断溢出和下溢−分别为2147483648,而不是最大64位有符号值。我不明白为什么会发生这种情况,这真的很令人沮丧,所以任何帮助都将不胜感激!以下是在这种情况下生成的汇编代码:
.globl compute
compute:
movq $2147483646, %rcx
pushq %rcx
movq $2147483646, %rcx
pushq %rc
我正在用Raspian OS上的ARM编写计算器程序;它是一个简单的计算器,使用反向波兰符号,只使用整数,只有4个运算(加法+,次-,乘法*,最大M)。代码还应作为连续循环运行
这是到目前为止我的代码,我可以输入值,但之后我得到一个seg故障
.global main
.func main
main:
BL _scanf
MOV R1, R0
BL _getchar
MOV R3, R0
BL _scanf
MOV R2, R0
我将我的一个算法移植到ml64的汇编中,一半用于运动,一半用于查看我能实际获得多少性能
无论如何,据我所知,目前我正在尝试了解堆栈帧设置,在本例中:
push rbp ; inherited, base pointer of caller, pushed on stack for storage
mov rbp, rsp ; inherited, base pointer of the callee, moved to rbp for use as base pointer
我有一些关于8086汇编语言编码的问题
你能为每一个算术和逻辑运算(加法、减法、移位运算…)使用所有的通用功能吗
你们能给寄存器分配常数吗(mov ax,1;mov bx,5…)
您能否以所有可能的组合(mov ax、ss、mov es、bp、mov bp、cx、mov si、di…)将一个寄存器分配给另一个寄存器
如果任何问题的答案都是否定的,那么限制是什么?
某些说明适用于某些寄存器@Wayne Conrad
说。例如,div指令(div arg)仅将AX或DX:AX用于
股息、AH或DX用
我发现mul和imul都可以用来将有符号数乘以无符号数
例如:
global _start
section .data
byteVariable DB -5
section .text
_start:
mov al, 2
imul BYTE [byteVariable]
您可以将imul替换为mul,结果仍然相同(-10)
mul和imul在将有符号的数字乘以无符号的数字时是否完全相同,或者它们之间是否存在差异?如注释中所述,上半部分是不同的。如果不关心上半部分,可以在所有形式中
我目前正在大学学习组装,最近开始编写组装程序,在32x32 LED模拟器上点亮LED
本周我们有一个实验室,第一个问题是“创建一个程序,点亮一个随机的单个LED,并一直持续到所有LED都点亮”。我有一个朋友告诉我他们是怎么做的,但我仍然不知道有些选项是如何工作的。
代码如下:
.data
x DWORD 0
y DWORD 0
row DWORD 0
row_copy DWORD 00000001h
.code
我正在运行以下代码:
448a: bf90 263e 0000 cmp #0x3e26, 0x0(r15)
4490: 0d20 jnz $+0x1c
r15值为:
r15 = 439c
而内存看起来像:
4390: 6045 0200 9c43 6400 8844 5044 3e26 0000
请注意,在内存位置439c和439d分别存储值3e和26。因此,我希望在执行命令448a后激活Zero标志,但这不会发生
所以我的问题是,为什么在比较两个相等的
我需要在x64汇编中构建一个计算器程序,其中用户输入两个数字,然后程序向用户请求运算符(+、-、*、/)。我试图将输入与存储的变量进行比较,以便将输入与这些变量进行比较,并执行用户指定的操作
在gdb中运行程序时,我看到如果我为运算符和变量:加法打印/c(当我将运算符设置为+),它们都存储相同的值,但在cmp中,它不会跳转到相应的代码块
我的代码有点像这样
segment .data
mult db "*"
divide db "/"
addition db "+"
subtra
条件1。我有myassembly.s但没有main
条件2。相反,myassembly.s具有全局符号\u start
条件3。我想链接\u IO\u stdin\u使用输出二进制文件
…这里是有问题的部分。
\u IO\u stdin\u used在crt1.o上断言,如您所见:
问题。我可以在没有的情况下链接crt1.o吗?
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
…
我更具体地附上我的情况,因
我想知道为什么x86体系结构上的指令FYL2XP1精确计算数学公式y·log2(x+1)
这个公式有什么特别之处?操作数y通常是一个编译时常数,暂时忘掉x+1
由于log_b(x)=log_b(2)*log_2(x)该指令允许计算x+1任意基数的对数
请注意,log_b(2)是一个常数,因为很少需要计算底部有自由度的对数
FYL2XP1和FYL2X是计算对数的唯一两条x87指令。
如果对数是一个代数函数,一条指令就足够了,但由于它是超越的,英特尔给出了两个版本
FYL2X适用于对数的全域,但它在
我写这段代码,目的是返回1)SP寄存器未初始化,因此您正在将内存推到0x0000,这取决于您的MCU可以是任何内容。这也会把电话和ret弄得一团糟
2) 您的代码以堆栈段结尾,因为RSEG CSTACK位于RSEG代码之后和代码之前
改变
RSEG CODE ; ORG 0x3100 - place program in 'CODE' segment in to Flash memory
RSEG CSTACK
Main
到
假设
我在大学里学过8086英特尔处理器的汇编编程。我现在正试图修改它
我听说汽车嵌入式系统需要装配,所以我想知道哪种学习方法最好?我不需要浪费时间,因为我想找份工作
修改8086的装配真的有帮助吗?或者移动到32位x86汇编之类的组件更好
谢谢。你的标题提出的问题与正文完全不同。一般来说,你应该问一个简单的问题
不,没有通用的汇编语法-或者实际上有,但你可能不是说,汇编语法通常是:
或类似的
对于x86,实际上有两种常见的语法——Intel和AT&T,它们具有来自不同汇编程序的多种Intel语法变体
我正在尝试为Commodore 64/6502交叉汇编程序建立一个尽可能可重用的cmake构建系统,名为
我的问题是:
我如何让CMake[尝试]检测并设置tmpx或tmpx.exe可执行文件和正确路径,具体位置取决于主机平台?
如果可能的话,下面列出的/cmake/模块中有哪些是这样的搜索/查找模块
是否有办法让cmake.检测并列出TMPX版本,而不是显示:
--ASM\U TMPX编译器标识未知
除此之外,我们非常感谢其他建议
(以下是我的个人资料和以下文件)
My/CMakeL
我一直试图理解GCC生成的汇编语言代码,在许多函数(包括_start())的开头经常遇到这条指令,但找不到任何解释其用途的指南
31-0000000000001040 <_start>:
32: 1040: f3 0f 1e fa endbr64
33- 1044: 31 ed xor ebp,ebp
31-0000000000001040:
32:1040:f3 0f 1e fa endb
我试图翻转xmm0内部最低有效浮点的符号位。我尝试将-0转换为另一个xmm寄存器,并用xmm0对其进行异或。不幸的是,虽然我的浮点值消失了,但我已经实现了翻转符号。有没有办法在asm中使用xorps来翻转符号位?我也看到过一些关于如何做到这一点的帖子,但都是用c写的
# xmm0 contains 4 floats
# goal is to flip the sign of the least significant one
mov eax, -0
cvtsi2ss xmm1, eax
xorp
处理汇编代码,并想知道为什么指令subl$8出现seg错误,%esp
pushl %ebp
movl %esp, %ebp
movl 16(%ebp), %esi
movl 12(%ebp), %edi
movl 8(%ebp), %eax
movl $0, %ebx
subl $8, %esp
jmp .LL1
.LL1:
cmpl %ebx, %esi
我正在开发一个基于Cortex-R5(带有PMSA的ARMv7)的嵌入式系统
固件具有一定的灵活性,可以在运行时创建可缓存内存区域。为了简化缓存维护,我希望在任何DMAC操作完成后使D-cache无效
是否有任何方法可以有效地查询CPU的可缓存性,这样我就不需要为每个DMAC操作使缓存失效
我正在尝试设计一个程序,使车载LED每秒闪烁一次。因此,FPGA板上的所有LED亮起1秒,然后熄灭1秒。我被建议使用间隔定时器或中断服务程序来测量一秒钟的周期
DE-10纳米
我提出了这个解决方案,但不起作用。我不是要你做我的家庭作业,只是想得到一些建议/提示
提前谢谢
以下是我目前的代码:
.include "address_map_arm.s"
.text /* executable code follows */
.global _sta
我开始在32位x86汇编中为我的操作系统编写BrainF*ck解释器。我已经用C编写了一个可以正常工作的程序,并尝试在汇编中实现它,但在汇编中编写的程序不会打印任何输出
我对组装还是新手,所以我想我只是犯了一些初学者的错误。我唯一能想到的是我把地址弄错了。
如果有人能指出我做错了什么,我会非常高兴
我用相同的输入测试了C和汇编程序:
-[->+-.+[->++.[->++.->+.->++-.+++.
它应该打印RexOS
我为我的C代码创建了一个粘贴库,如果这有助于理解我试图实现的目标:
我
我写这段代码是为了在计算后显示当前值。但是程序给出了错误的输出,当它应该给出十进制10的结果时,它给出了13107的结果,我找不到原因。在此之前,我所做的基本上是从用户那里获取输入,并将这些值存储在si寄存器中
islem:
MOV AX,[SI+14]
MOV BX,[SI+10]
MOV CX,[SI+2]
SUB AX,BX
SUB AX,CX
MOV BX,[SI+8]
MOV [SI+16],AX
MOV DX,00H
M
上一页 1 2 3 4 5 6 ...
下一页 最后一页 共 482 页