我熟悉X86[-64]体系结构和组装。我想开始开发ARM处理器。但与桌面处理器不同,我没有真正的ARM处理器。我想我需要一个手臂模拟器
说
需要一个ARM汇编编译器,最容易访问的是ARMulator
我想下载Armulator,但从中发现
它不是单独出售的。但是你可以下载一个RVDS评估,包括RVISS/ARMulator
我已经下载并安装了RVD,但它看起来非常复杂。我无法确定编写ARM assembly并运行它需要做什么
我想用汇编语言而不是C/C++编写。我没有ARM处理器。什么是好的模
你可以在互联网上看到汇编代码和汇编代码,但字节码上几乎什么都没有。为什么呢?汇编编程的需求和优点也应该适用于字节码编程 我怀疑你所说的汇编编程受欢迎,但这不是重点
答案很简单,“因为没有任何必要”。人工汇编语言的设计是为了满足所设计语言的需要,并且与它们有着非常密切的关系,而不是硬件。没有什么比用高级语言更容易实现的了。大多数字节码(无论如何,我都见过它们)都被设计成易于编译的目标。例如,使用x86,您可以通过手工编写的程序集获得相当多的收益,因为为其编译是一件非常痛苦的事情。编译Java字节码
我读了这篇文章:
它说:
以告诉x86/IA-32处理器的指令为例
将立即8位值移到寄存器中。二进制代码
此指令为10110,后跟一个3位标识符
注册使用。AL寄存器的标识符为000,因此
以下机器代码用数据加载AL寄存器
0110001[4]
10110000 0110001
它解释了如何更容易地将其编写为:
MOV AL, 61h ; Load AL with 97 decimal (61 hex)
下面是我的问题
那么,计算机程序/可执行文件只是二进制数据(0和1)
当使用像
我遵循Jack Crenshaw在上找到的优秀的“让我们构建编译器”教程。我正在用Easy68K68000编辑器/汇编程序/模拟器测试生成的68k程序集。我已经了解了第2部分,但是分割过程对我来说不正常
...
{ Recognize and Translate a Divide }
procedure Divide;
begin
Match('/');
Factor;
EmitLn('MOVE (SP)+,D1');
EmitLn('DIVS D1,D0');
end;
...
查看AVR指令集,2010年添加了四条指令
LAC load and clear
LAS load and set
LAT load and toggle
XCH load and exchange
有人知道哪些芯片有这些说明吗
哪些工具支持这些说明
关于他们做什么的更多信息
(Z) 这些可能不存在于当前(如最初的问题)芯片中,但它们都有一个共同的主题——原子内存操作。它们的用途通常是线程之间的同步,它们包含在指令集级别可能表明Atmel计划推出多核AVR芯片。因为它们现在已经被指定了,所以工
我一直在想如何在汇编中从硬盘上打开文件。我想在不使用DOS中断或任何需要操作系统的情况下实现这一点,因为我正在尝试构建一个简单的操作系统。当然,我对BIOS中断很满意。操作系统提供了两组功能,您必须模拟这些功能才能访问文件:
设备驱动程序,可以读取和写入原始数据(在您的情况下,从磁盘读取和写入)
一个工具库,可以抽象地理解文件的结构
如何阅读这些部分;这将调用驱动程序来执行实际的I/O
您可能能够调用BIOS调用来模拟坏的设备驱动程序;通常情况下,真正的驱动程序很复杂,以确保效率和良好的错误
下面的代码在5级流水线数据路径上运行。我很难知道我对管道工作原理的理解是否正确。在下面的尝试中,我试图通过在适当的位置插入“气泡”来解决没有数据转发单元的数据路径中的数据危险。我的第一个问题是,我下面的管道逻辑正确吗
我的第二个问题是假设数据路径中有一个转发单元,从MEM->EX和从WB->EX,这将如何改变我的逻辑
add t0, s1, s2
add t1, t0, s3
sub t2, t0, t1
xor t3, t2, a0
lw t4, 0(t7)
slt t5, t4, t3
这
我有以下代码:
mov ecx, 0
mov eax, offset ReadWritten
RottenApple:
push ecx
push eax
push 0
push eax
push 1
push offset bytearray
push consoleOutHandle
call WriteConsole
pop eax
pop ecx
inc ecx
inc
这部分是什么意思:
MOV SI,SP
PUSH AX
POP ES
ES如何获得0000:7c00(以及更多DS)
在这个MBR模型中
0000:7C00 FA CLI disable int's
0000:7C01 33C0 XOR AX,AX set stack seg to 0000
0000:7C03 8ED0 MOV SS,AX
我得到了一个包含stm32l152rb微处理器的STM32L发现板。我试图在没有任何库的情况下在汇编中对该板编程。到目前为止,我成功地编写了链接器脚本和一个基本例程,该例程将.data部分复制到RAM中,并将bss部分归零。但除此之外,我有点迷路了
作为了解配置GPIo工作原理的一个小实验,我想为连接到GPIo端口B引脚7的绿色LED发光板制作一个程序。通过阅读,我得出结论,我需要做以下两件事:
将GPIO端口B针脚7配置为输出针脚
将所述引脚设置为高
但是在这个地方,我没有看到森林,而是树木。
在经历了头痛之后,我发现我一直在将1字节变量(db)复制到EAX,这意味着变量后面的3个字节也会被复制。现在我知道了这一点,我正在查看类似场景的代码,并发现:
在.data中,我有一个数组,其大小定义为常量:
array db 1,2,3,4
size equ $-array
稍后,在.text中,我有以下内容:
mov EAX,size
这让我想知道:那里到底发生了什么?尺寸是多少?是一个字节吗?一句话?EAX是否接收到不应该接收的额外字节?是的,汇编程序应该为其选择最合适的大
您好,我对组装非常陌生(今天刚开始),在执行中所说的操作时遇到了这个问题。我用以下文字创建了一个asm文件:
bits 16
org 0x7c00
jmp Main
:In= si = string, ah = 0eh, al = char, Out= character screen
Print:
lodsb
cmp al, 0
je Done
mov ah, 0eh
int 10h
jmp Print
Done:
ret
第一条指令等于r0=*ar0++**ar1++,第二条指令等于r1=r0+r1。但是,第二条指令中的r0值是多少?有两种选择:
r0是并行指令之前r0的值
r0是第一条指令的结果
什么是正确的
此外,我如何并行化一个简单的过滤器,比如下面的过滤器
void emg_filter(int const* a0, int* a1)
{
int const N = ...;
int result = 0;
for (; N > 0; --N)
result
我用8086汇编语言编写了一个代码,用于找出给定数字的所有因子。但问题是,如果因子大于9,则输出错误。例如:当输入为54时,我得到正确的结果,但当输入为72时,我得到错误的输出。如果结果大于9,我将如何显示输出
这是我的密码:
.MODEL SMALL
.STACK 100
.DATA
NUMBER DW 72
.CODE
MAIN PROC
MOV AX,@DATA
MOV DS,AX
MOV AX,NUMBER ; storing the dividend
MOV B
我正在写一个程序,比较数据段中定义的两个数字。
我这样定义它们
Dseg SEGMENT PARA PUBLIC 'data'
NUM1 DW 1 ; num1 = 1
NUM2 DW 2 ; num2 = 2
MAX DW ? ; variable to save the max number
MIN DW ? ; variable to save the min number
Dseg ENDS
Cseg SEGMENT PARA PUBLIC 'code'
ASSUME
nasm给出以下错误消息:
error: invalid operand.
MOV $16731,%ebx
守则:
MOV $16731,%ebx
MOV $19508,%eax
MOV $1436,%ecx
CMP %eax,%ebx
JL L1
JMP L2
L1:
IMUL %eax,%ebx
ADD %eax,%ebx
MOV %ebx,%eax
SUB %ecx,%eax
JMP L3
L2:
IMUL %eax,%ebx
SUB %eax,%ebx
MOV %ebx,%eax
AD
我非常需要帮助,因为我已经创建了这个汇编程序
(eject/dev/sr0)和运行程序时。
cd打开了,但我有一个奇怪的消息:“分段错误(核心转储)”
为什么我会收到此错误消息?
非常感谢您,祝您节日快乐=)
我假设第一个系统调用是一个open,第二个是弹出托盘的ioctl。你认为之后会发生什么?您忘记了结束程序,因此cpu将继续执行内存中的任何内容,直到遇到故障。您可能需要添加与moveax,1等价的内容;int 0x80
最后,通常的建议是:学会使用调试器。你的程序集…很奇怪。你这样做有什么
我想在8086程序中打印当前时间,但为什么它只打印奇怪的字符
此外,当我的系统中的时间为9:50时,CH值为15,CL值为33
org 100h
data segment
hour db " "
min db " "
data ends
printf MACRO str
lea dx, str
mov ah, 9
int 21h
endm
code segment
start:
mov ah, 2Ch
int 21h
mov hour, CH
m
当我尝试汇编以下代码时:
push BYTE 0x80
NASM显示以下警告:
warning: signed byte value exceeds bounds
这意味着什么?请注意,0x80以下的值不会导致警告。PUSH imm8实际上不会将字节推送到堆栈上。它至少推送一个字,该字将从字节操作数进行符号扩展。因此,如果操作数为0x80,您实际上会按0xff80、0xffffff80或0xffffffff80,这很可能是NASM警告您的
这在以下章节中进行了描述:
当前代码段描述符中的D标
我刚刚开始学习自动编写汇编程序
如何在x86_64上使用linux添加两个1字节整数。学习汇编的一种方法是用更高级的语言(如C)编写希望处理器执行的操作,然后查看编译器生成的内容
unsigned char addition (unsigned char a, unsigned char b)
{
return a+b;
}
有时这会导致一些奇怪但有效的汇编程序构造:
movzbl -4(%rbp), %edx ;a
movzbl -8(%rbp), %eax ;b
leal
目前我正在汇编程序x86 AT&T中与RNS合作。我必须将5个余数放入一个寄存器,%eax。一段代码:
.macro division number
mov $0, %ecx
loop_getremainders:
mov $0, %edx
mov number, %eax
mov dividers(,%ecx,4), %ebx
div %ebx
mov %edx, remainders(,
我正在编写一个16位实模式汇编应用程序
下面是代码的顶部:
org 100h
jmp start
%include "memory.asm"
str: db "aBc", 0
outstr: times 100 db 0
start:
mov si, str
mov di, outstr
call english_to_morse
jmp $
如你所见,我只给莫尔斯打了一次电话
以下是英语到摩尔斯语功能:
english_to_morse:
pus
我想测试硬件的行为,以防我只是为了测试目的而试图写入一个段(例如DS或GS以外的数据段)。。。是否有汇编指令允许我指定带有偏移量的段并直接写入?要写入特定段,必须首先将段号加载到段寄存器中,然后使用适当的段前缀进行加载。例如,要访问0x1234:0x5678,可以执行以下操作(在AT&T语法中):
谢谢@fuzzxl的重播,但我仍然对一件事感到困惑。mov指令不是只会用新的选择器更新段寄存器吗?我的意思是,如果我用prefeix执行此操作(mov%es,%eax),有什么区别?使用prefeix
我正在尝试编写一个小型8086+汇编程序,可能仅限于实模式,并且可以满足于可能的指令的较大子集
x86指令很复杂,需要一个复杂的表解决方案,这很好,但我想要更小/更简单的
我的一个想法是从操作码开始,创建一组与实际机器指令更密切相关的助记符/寻址模式/寄存器
这件事做了吗?我在哪里可以看到?我的直觉告诉我,这一定已经完成了,但我在网上找不到任何东西
我已经调查过的事情:
AT&T语法:无法解决问题,您仍然需要一个复杂的
查表;最后,它与Intel语法基本相同
ASM:一个很酷的512字节技巧汇编
例如,如何接受大量输入,然后进行比较
mov ah,01h
int 21h
我想接受多个字符,并将该数字移动到al,以通过用户示例输入的led闪烁访问端口。用户想键入32,但单个字符无效
mov bl,al
delay:
mov ctr,'0'
mov al,bl
mov cx,100
skip:
x:
mov al,00000000b
mov dx,378h
out dx,al
loop x
Z: mov al,bl
mov dx,378h
out dx,al
loop z
inc ct
我想在汇编中编写一个快速整数平方根算法,它需要无符号32位。我一直在通读,有了一个想法。这是我的伪代码:
res <- 0
for i from 15 downto 0 do:
change the ith bit of result to 1
if res^2 > x then:
change the ith bit of res back to 0
return res
我被困在for循环操作中,更改第I位并移位。我也不想使用除法或sqrt指令。我知道我
我正在尝试用汇编语言编写一个程序,在这个程序中,我想在屏幕上移动一个文本或字符,就像屏幕保护程序一样,也就是说,首先它应该向前移动,也应该向下移动。当它到达屏幕的下限时,它应该开始向前和向上移动,反之亦然
我已经尝试过了,我已经能够在向前和向下的方向上移动的字符在同一时间。当角色达到屏幕的下限时,我希望它向上和向前移动,但我似乎不知道该怎么做
我使用的是emu8086汇编程序
.model small
.data
st1 db "O",13,10,'$'
.code
main proc
我正在学习汇编语言,我有一个疑问。我正在用以下代码编写一个简单的“hello world”:
.model small
.stack
.data
message db 'Hello world! $'
.code
start:
mov dx,@data
mov ds.dx
lea dx,message
move ah,09h
int 21h
mov ax,4c00h
int 21h
end start
我假设messagedb'hellowo
我想让我的Arduino MKRZero在生锈的地方工作。我成功地使LED闪烁,下一步是将全局数据从文本复制到数据
我定义了以下链接器变量:
生锈
extern{
静态uu堆栈顶部:u32;
静态mut_uuetext:u32;
静态mut uu数据u开始uu:u32;
静态多数据端:u32;
静态多机bss启动:u32;
静态mut uu bss uu end uuu:u32;
}
C
extern uint32\u t\u etext;
外部uint32\u t\u数据\u启动\u;
外
BPIALL被记录为未实现,但分支预测器被记录,并且在测试中很容易看到它被实现。ACTLR中的BTAC位如前所述工作,您基本上可以使用一个位禁用它,并且可以使用另一个位防止缓存新分支。但到目前为止,我还不知道如何清除BPI缓存。(清除指令缓存没有帮助)。在禁用分支预测后是否尝试过ISB指令?由于BPIALL没有实现,我不确定您还可以做些什么。分支预测器始终根据手册启用,您所能做的就是禁用BTAC。我想你不是真的想在飞行中打开和关闭它。我只需要关闭它进行调试。是的,dsb然后isb。听起来你在读我
在我试图了解计算机中最底层发生了什么的过程中,我最近发现了一些东西,以便我可以开始在汇编中编码:
但我在这里看到的是,有系统调用正在进行,我们正在使用ABI。我不明白的是为什么汇编中会有系统调用。我所知道的是,汇编成机器码更多的是一种转换——将操作码转换成二进制等价物等等
因此,我想知道的是,我们为什么要进行系统调用,是否有一种方法可以在x86_64 ISA的纯汇编指令中实现这一点,而无需使用系统调用(因此可能需要编写我们自己的打印函数)初学者通常认为组装是一种神奇的、深奥的学科,它允许操纵现实
你好。我的项目是用英寸和磅计算体重指数。因此,用户将以英寸为单位输入身高,以磅为单位输入体重。我已经学会了除法和乘法。我只是不知道除法后如何包含小数点,因为我必须再乘以703,只有整数乘以703
n1 dw 0
n2 dw 0
;gets input from user
xor dx, dx
mov ax, n1 ;n1 is the weight and n2 is the height so i'm dividing them
mov bx, n2
div bx
mov bx, a
我是装配新手,我正在尝试做以下工作:
伪代码:
问题是我不知道如何保存和比较ASCII值我添加了一些代码说明来解决您的问题;我已经成功地测试了它们。还有一个显示ASCII代码的新例程。请注意,有些ASM编译器使用DISPLAY作为保留字,我在dispOut中将其重命名为:
.MODEL SMALL
.STACK 100h
.DATA
insertMsg DB 13, 10, 'Introduce un dato: ', 13, 10, '$'
outputMsg DB 13, 1
我对8086组装很陌生。我需要写一个程序,只将地址0-10h中的正数复制到一个从20h开始的内存块中,并将正数的数量保存在dh中
我认为最好的方法是制作一个数组,并在20h时将其复制到第二个数组,但我不知道如何使arr2在20h开始,我还尝试制作一个值“size”,该值在每次循环执行时递增
这是我目前的代码:
org 0h
.DATA
arr1 DB 0h,-1h,2h,3h,-4h,5h,6h,-7h,8h,9h,10h
arr2 DB 11 dup(?)
size DB 1h
.COD
我需要在汇编8086中减去两个双字,并将结果作为十进制数打印在屏幕上。我需要得到这两个双字中的每一个,比如大小可变字乘以大小可变字
我写了这段代码,但我不确定我用双字和带符号的数字是否正确
使用两个内存位置不可能进行减法运算,因此使用max\u niz1乘法的结果将min\u niz1放入minmax1。乘法的第二个结果需要在AX和DX中,我可以在这之后写减法,然后像在代码中一样在屏幕上打印吗?
这是否也适用于有符号的单词
mov AX,min_niz1
mul max_niz1
push ax
正如问题标题所述
如果执行正操作,则在汇编语言中0是否为正?取决于特定的语言,但通常零不是“真实的”。哪种汇编语言?你能不能自己编写一个简单的分支并进行测试以验证这一点?@Hunter我对汇编tbh了解不多,但我认为可以安全地假设这样的东西在所有语言中都会有相同的结果?零是非负和非正的,汇编与此无关。对于CPU的特殊设计以及某些指令在特定上下文中使用零时会发生什么的推理,请指定CPU和上下文。汇编语言不像其他语言那样是编程语言,它更像是CPU芯片硬件设计的文本表示,因此每个CPU都可以有不同的指
我需要在8086中编写以下C代码段*
尽可能短的装配(小于10
字节)但我只能设法用12个字节来写它
有什么想法吗
while (ax) {
bx--;
ax &= ax-1;
}
您正在尝试的操作称为填充计数,即对寄存器中的设置位数进行计数
在较新的CPU中,实际上只有一条指令用于此。由于2018年的目标是最初的8086真的没有那么有趣
答案很简单:
f3 0f b8 c0 popcnt eax,eax
29 c3
我正在编写一个程序来提示用户输入一个句子,一个十六进制值表示要从句子中删除的字符数,另一个十六进制值表示要从中删除的位置。我遇到了一个问题,提示用户输入第一个十六进制值,出于某种原因,汇编程序没有等待用户输入值。提示输入一个句子(等待用户)和最后一条输入十六进制值的指令一样有效。为什么会这样
String1 BYTE "Enter a sentence: ", 0
String2 BYTE "Please enter the number of characters to delete(in
我必须将以下C语言转换为汇编语言。
有人能帮我吗?
(a)
我对a)的回答是
问题b),我不知道怎么做
if(x<=0 OR x>=25){a=1}
if(x=25){a=1}
对于a),您希望按照这些思路进行操作。对于if的两个部分,r4用于存储中间结果和x值
对于b),我们将假设OR的行为与大多数编程语言中的行为相同,即,仅当第一部分导致false时才计算条件的第二部分
顺便说一句:在编写汇编代码时,您通常会有这样一种印象,即您正在编写超高效的代码,因为您在最低级别上处理每一
我有以下代码,但我一直收到一个算术溢出错误。我试图解决的问题是将两个31位数字相乘,并将结果存储在$t2$t3中,然后打印出正确的结果。似乎我已经编码了两个要相乘的数字,最终结果是一个31位的数字
我很想缩小我感觉自己做错了的地方,但我真的看不到我需要改变的地方和内容
# program to multiply two 31 bit binary numbers (A & B),
# using the “shift and add” .
.data
# declare the v
这条线
; roots.asm
segment ;gcc.text
global -c rootsc._roots
_roots:
enter 0,0 ;create stack frame for procedure parameters
xor EAX,EAX ;EAX = 0
fld qword[EBP+8] ; load floating point
目前我正在使用int 16,1。出于某种原因,在我的代码中,第二次使用int 16,1(在游戏循环中)时,它保持与第一次按下的值相同,无论它是否仍然按下。我已经放弃了,我在问是否有其他方法可以在不停止代码的情况下获得键盘状态
我已经试着调试了好几个小时,运行turbo调试器,通过多个老师运行,没有问题的来源
如果需要,这是完整代码的要点
实际游戏循环
Game_Loop:
call DrawMole
; push offset Scorearr
; push 0
我对编程比较陌生,而且我很难理解mips
我希望能够以升序排列给定数组并打印排列的数组。我试过这么做,但我运气不好
我的程序是为用户显示阵列,然后用户按2来订购阵列并在屏幕上打印这个新阵列
我已经包括了我在这方面的尝试,如果没有意义,很抱歉
.data
prompt:
.asciiz "Press 1 to display array, and Press 2 to display it in ascending order"
array: .word 0x00, 0x33, 0
标签: Assembly
X86
gnu-assembleraddressing-modeintel-syntax
使用GCC,为32位英特尔体系结构编译,使用.Intel\u语法noprefix。
假设我有以下.data部分:
A: .int 0x1, 0x2
当用作操作数时,A,[A],偏移量A,以下各项之间有什么区别?
另外,在寄存器和内存标签上使用[…]时有什么区别
简单地编写寄存器和将其放入[…]之间的区别得到了很好的回答。让我给你一个简单的解释。
[]方括号的意思是“不处理内容,但处理地址”。
当使用带标签的数据时,可以省略它们(这取决于汇编程序的语法,但在MASM中它肯定是这样工作的)。为什么
我正在用C为x86编写一个自定义内核。每当我试图从char*访问一个值时,我都会得到一个随机值
void test(char input[]) {
char* video_memory = (char*) 0xb8000;
*video_memory = input[0];
}
void main() {
test("ba");
}
看起来我应该打印“b”,但它给出了一些随机符号
这个也一样
void test() {
char* vide
我有一个汇编函数X86,和ARM汇编一样,我想把它移植到DSP C674x,但我不知道C674x汇编
函数:交换堆栈和调用(*stack,*func\u entry,*struct\u info\u ret);
结构信息检索:
进入
param
ret
x86汇编指令
__asm {
mov ecx, stack
lea esp, [ecx - 4]
and esp, -16
mov eax, struct_info_ret
mov [esp],
我需要制作和汇编一个程序来查找字符串中重复的子字符串,但我的程序只是查看整个字符串,没有找到匹配项。你怎么修理它
代码本身(不要介意西里尔文的注释):
你试过单步走吗?提示:验证edi?@ErikEidt,但我正在使用edi。还有,你说的“验证”是什么意思?他的意思是,你在mov-edx,substring有一个输入错误,因为你的评论说它应该是edi。然后你还需要将cmp-byte[edi],0更改为edx,因为edi没有设置为任何值。那么scasb呢?
section '.data' data
标签: Assembly
dosx86-16integer-divisionsigned-integer8086
我的任务是编写一个程序,显示我的地址的线性
程序的PSP。我写了以下内容:
ORG 256
mov dx,Msg
mov ah,09h ;DOS.WriteStringToStandardOutput
int 21h
mov ax,ds
mov dx,16
mul dx ; ->
我是8086汇编编程的初学者。我写了一个程序来打印三位数的和。我想我已经成功地将一个三位数作为输入,而且使用AAM的求和部分似乎是正确的,但输出是一个不需要的字符。有人能告诉我哪里出错了吗?首先,您已将total声明为db(数据字节),因此total可以容纳255(最大值)
所以,整个代码的设计目的是给出0~255之间的结果。如果输入大于255,则在读取输入时将溢出,并对左侧的结果进行操作。
现在,让我们谈谈第一点:
按enter键后,控件将跳转计算,将总计加载到al中
当执行aam(bcd乘后
在使用LBA方程读取或写入硬盘之前,我试图获得硬盘寄存器的正确状态
所以这里有一个小代码:
0x8392 <waitdisk+7> mov eax,0x1f7 │
│ 0x8397 <waitdisk+12>
1 2 3 4 5 6 ...
下一页 最后一页 共 266 页