是否有人知道我可以在某个网站上找到32位MIPS指令/操作码列表,这些指令/操作码具有以下功能:
明确区分真实操作码和汇编语言宏(伪指令)
描述指令行为,包括取决于权限级别的差异。
指示引入/修订指令的指令集版本(例如MIPS I、MIPS II、MIPS32等)
包括特权指令,如syscall
我知道有许多网站记录了教学集的“一部分”,主要用于教学目的。它们倾向于省略或仅部分描述浮点指令和特权指令
如果您想知道,我正在查看MIPS处理器子集的Verilog代码,并试图弄清楚它在多大程度上符
我在读MIPS中的除法,我发现了那个除法
将$s除以$t并存储
以$LO表示的商和以$LO表示的余数
$HI
维基百科说
HI和LO用于访问乘法器/除法器结果,由mfhi(从高位移动)和mflo命令访问
HI和LO是寄存器吗?它们是什么数字寄存器?HI和LO不是数字寄存器,IIRC。它们仅用于存储不适合单个寄存器的操作结果(例如,将两个32位整数相乘可能导致64位整数,因此溢出进入HI)
编辑:根据,它们确实是特殊寄存器,因此没有编号,只能使用特殊命令访问。这些是用于存储乘法和除法结果的特殊
在DOS环境或Windows环境中汇编、链接和加载汇编语言代码或C代码有什么关系?结果不应该是一样的吗?所有的执行都是由微处理器完成的,而不是操作系统。我正在从MS-DOS时代的一本旧书中学习汇编语言。这是挫折吗?汇编语言及其代码执行不是独立于O/S吗?或者是用其他语言编写的代码
汇编语言及其代码执行不是独立于O/S吗?或者是用其他语言编写的代码
是和否
对。机器的语言独立于操作系统。不管是你自己写的还是C编译器为你写的
不,你必须使用操作系统来实际运行软件。如果你想让它做一些有用的事情,你需要
据我所知,shellcode[]是生成shell的十六进制操作码,代码的最后一行用操作码覆盖ret。我们是否将操作码或内存地址插入RET?堆栈上的RET寄存器是代码返回到的位置,将操作码放在那里没有多大帮助。我怀疑您想要运行的代码地址是最有可能的候选地址。耶!总的来说,最好是考虑你使用的交互项是什么,以及如何使用它们,而不是试图盲目地将数据转储到它们中。我想在这种情况下,指出它是完全不可移植的,几乎肯定是一个非常糟糕的主意是浪费时间的…它不会覆盖返回操作码,而是覆盖堆栈上的返回地址(假设它接近堆
我正在写一个程序,可以读写字符,将小写字符转换成大写字符。这是我的第一个汇编程序,所以我试图首先让程序读入一个字符并写出它。这是我到目前为止编写的代码:
.model small
.8086
.data
lower db 'a'
.code
start:
mov ax,@data
mov ds,ax
mov ah,8
int 21h
我正在为一些x86-64汇编程序而挣扎,浮点数字让我头疼。例如,当我运行此代码时:
section .data
omega: dq 2.0
omega2: dq 3.0
section .text
global func
func: push rbp
mov rgp, rsp
FINIT
FLD qword [omega]
FLD qword [omega2]
FADD st0, st0
mo
我认为在具体的例子中很容易解释,我理解beq的工作原理就像r9==r10,该语句调用同一行上显示的标签,但我不完全理解其他语句
开始:
.word 0
.wordinstr1
INSTR1:
.单词1
.单词77
.word INSTR2
指令2:
.单词2
.单词15
.单词FIN
鳍:
.单词3
acc:
.word 0
.text
.global main
main: movia r8, START
movia r9, acc
myloop: movi r10
我不熟悉组装(更习惯于使用C#),但我决定看看是否能学习它,并对我的电脑在引擎盖下的功能有更多的了解
我的问题是,在Windows上编程时,我必须使用win32库吗?例如,如果我想在控制台窗口中输出,比如说“A”,是否有一种“通用”的方法,或者我必须调用win32?还是我完全不知道它是如何工作的?除非你需要Win32做的事情,否则你不必使用Win32。例如,我不相信有任何级别比Win32更原始,可以执行诸如输出到控制台之类的操作。你所说的“.code”?@JohnSaunders是什么意思-如果
我目前正在读《SPARC体系结构、汇编语言编程和C.第二版》。我到了书中的一个地方,我不明白或不能理解某个命令:
define(loc, 0)
define(sto, 'loc: 44 $1 define('loc', eval(loc+2))')
问题是,我确实理解第一行。但我真的不明白第二行的第二个论点。书中的解释也没有帮助
书中:
这里我们首先定义了一个符号loc,其值为0。此符号将表示位置计数器,即正在汇编的指令的内存地址。每个宏定义都已更改,首先打印loc的当前值,然后将loc
我一直在学习这个教程
由于我想在不更换操作系统的情况下控制gpio,我只想编译汇编代码,然后像程序一样运行它
我改变了节目的开始
.global main
.func main
ldr r0,=0x20200000
mov r1,#1
lsl r1,#18
str r1,[r0,#4]
mov r1,#1
lsl r1,#16
str r1,[r0,#40]
loop:
b loop
然后在Pi上执行这些操作
as -o gpio.o main.s
gcc -o gpio
端干管
当我使用CMP命令进行比较时,它只会把我带到JGE。。不管值是什么。。请问有什么解决办法吗
我还尝试使用JE,并给出了相同的输入,但即使这样,我也需要使用更大的标签。cmp指令修改标志,跳转指令根据标志状态做出决定。这些标志可能会被这些调用修改(正确地说就是写入):
jle和jg的行为将是意外的。您可以在调用前使用pushf存储标志状态,然后使用popf将其还原回来,类似于:
Cmp Ax, 100D
Call DumpRegs
Call WriteInt
JLE lesser
JG g
嘿,我之前问过这个问题,但是我在这个程序中遇到了一些新问题。
我对汇编语言相当陌生,我希望能得到一些帮助。我试图计算一个整数的二进制表示中的个数。我相信我应该把我输入的寄存器移位32次,每次遇到1时递增。如果不是1,我应该跳转以避免增加ebx。我仍然是一名初学者,因此我仍在学习MASM语法,但以下是我目前掌握的内容:
__declspec(naked) unsigned int count(unsigned int v) {
__asm{
PUSH EAX
PUSH EB
我见过一大堆代码,比如
void makeArray()
{
char myString[30];
for(int i = 0; i < 30; i++)
myString[i] = '*';
}
问题:
我可以写mov-esi,ebp-30而不是lea-esi,[ebp-30]?
我是否可以编写mov esp,ebp而不是add esp,32?您的第一句话是wromg。括号缺失,那么它是正确的,第二个假设是正确的。您的第一个陈述是错误的。括号缺失,那么它
标签: Assembly
64-bitx86-64micro-optimization
我有一个x86_64例程,如果成功,它最终在YMM寄存器中以零结束,如果YMM寄存器成功,我想返回非零
我有一种方法可以做到这一点,即清除另一个YMM寄存器,根据该寄存器测试我的寄存器,然后在未设置CF的情况下有条件地增加重新返回寄存器(在我的情况下为RAX):
" xor %%rax, %%rax \n" // clear RAX
" vxorpd %%ymm0, %%ymm0, %%ymm0 \n" // clear YMM0
"
查看,我注意到分支指令执行时需要2个周期,执行时需要1个周期,而跳转指令需要3个周期
这是为什么?这似乎来自操作码的长度。JMP指令是32位指令,因为它必须从一个单独的字读取地址。该读数需要额外的时钟周期
分支和相对跳转rjmp和间接跳转ijmp是16位指令,也在2个时钟周期内执行。我了解到jmp允许访问整个程序内存。这就是为什么吗?如果我想分支,但没有条件,我怎么做才能代替jmpjmp这只是一条4字节的指令。请注意,RJMP,作为一条2字节指令,在2个时钟周期内执行。@Jester:RJMP是
使用编译器选项,是否可以限制例程使用特定寄存器集
例如:限制例程仅使用R0-R8
目的:如果某些编译器选项可用,那么我可以确保某些例程(如中断服务例程)仅使用有限的寄存器集,从而执行有限的上下文保存和恢复。,一致认为不可能逐个函数地执行
有一些方法可以在整个编译过程中限制寄存器的使用,所以如果将中断例程放在单独的编译单元中,则可以使用。如果希望编译器不使用R0生成代码,我相信它会像-ffix-R0一样使用。由于与ARM相关,IRQ已经存储了sp和lr。有更多的银行注册,这可能是你的解决方案。也可
我不确定如何将用户输入数据实际存储到寄存器中。我想提示用户输入一个带符号的10进制整数,然后将该整数存储到bx寄存器中。我所拥有的似乎并没有实际存储我所知道的任何数据:
;get user input
mov ah, 0Ah
int 21h
while:
mov bx, ax ;save char to bx
cmp ax, 13 ;is char = carriage return?
jmp endwhi
我正在尝试标记ASM(由编译器生成),以便在标记我的分析与相应的.s文件之间进行延迟分析。以下宏适用于GCC
#define ASM_LABEL(label) asm ("#" label "\n\t")
然而,随着叮当声,标签被移除
void kernel(double const * x, double * y){
ASM_LABEL (START)
y[0]+=x[1]+x[3]/x[4];
y[1] = std::exp(x[0]);
ASM_LABEL
我需要接收来自用户的输入,并且我需要首先使用malloc初始化缓冲区。我在网上找不到任何例子
这是缓冲区:
section .bss
buffer:
resb 80 ;store my input
怎么做的?这样行吗?(它可以编译,但我认为它不起作用…)
或者这个?(这不可编译)
问题是,当我给缓冲区输入0时,它会打印2608
应打印ASCII值,而不是48
输入1->相应地给出2609。所以我的猜测是,
我想把一个字节从累加器移到P1的上半字节
现在,我一点一点地设置一个字节
MOV C, ACC.3
MOV P1.7, C
MOV C, ACC.2
MOV P1.6, C
MOV C, ACC.1
MOV P1.5, C
MOV C, ACC.0
MOV P1.4, C
这对我来说似乎是一个糟糕的方法:它需要12个指令周期,而且代码很长。我希望SWAP和XCHD能起到作用,但间接寻址在SFR内存区域似乎不起作用
有没有更快或更短(不一定两者都有)的编码方法?我想让P1的下半字节保持不变。我不
标签: Assembly
masmuppercaselowercaseirvine32
我正在编写一个程序,它将获取一个字符串并输出原始字符串、一个全小写的字符串版本和一个全大写的字符串版本。但是,出于某些原因,输出如下所示:
Assembly is kinda fun
assembly is kinda fun-*
ASSEMBLY IS KINDA FUN
我不明白为什么“-*”出现在小写输出之后,尤其是因为它实际上与大写输出相同。有人能解释一下为什么会这样吗?这是我的密码:
TITLE MASM Template (main.asm)
我这里有两个问题:
1) >第2行发生了什么。“la”伪指令指的是加载地址,而不是文字“3444”,应该有一个标签。它如何加载文字的地址
2) >如果将第3行替换为“li$a0 3444”它将3444加载到寄存器#a0而不是地址。输出仍然是一样的。我想问的是,syscall如何知道in#a0是变量的地址或变量本身。打印整数的子例程如何正确工作,存储在#a0中的参数是地址还是整数重视自身
.text
li $v0 1
>>2 la $a0 3444 # When
我正在尝试使用NASM在Q模拟器中打印字符串。我的代码如下:
mov bx,HELLO
mov ah, 0x0e
int 0x10
HELLO:
db 'Hello', 0
jmp $
times 510-($-$$) db 0
dw 0xaa55
然而,当我编译这段代码时,我得到的输出是
UU
谁能告诉我为什么会这样?以及如何获得所需的字符串作为输出
提前谢谢。好的,这是你问题的要点
要加载字符串,必须将其移动到si(不想深入,只需执行即可)。接下来,为了将字符加载到寄存器AL中,请使
任务如下:
字母表中有一个给定的字符串,例如fgh。我必须用n个字母沿着给定的方向移动这个字符串。例如,如果方向为1,n=3,则输出为ijk。我已经创建了一个可以计算这些移位的程序,但是如果它到达字母表的末尾,它将在ASCII表中写入以下字符。例如,如果输入是vwy,那么输出将是yz{
loop1: ; if the direction is forwards
MOV AL, [ESI]
CMP AL, 0
JE end
ADD
我在巴里·布雷的《英特尔微处理器》一书中找到了这一点。这是真的吗?但是为什么呢?我知道在实际8086微处理器的实模式中,没有32位寄存器。因此,现在应该对32位寄存器施加相同的限制?我认为寄存器的内容是不相关的;有效地址不得超过0xFFFF:
如果EBP的值为0xFFFFF0,并且您使用指令mov EBX,[EBP+0x20]访问地址0x10处的内存。尽管寄存器的值高于0xFFFF,但这应该可以正常工作
如果EBP的值为0xFFF0,并且您使用的指令与在0x10010访问内存的指令相同。尽管寄存
修改第一个程序,这样,程序就可以访问数字a到e,而不是从类中进行计算,就好像它们是一个5元素数组一样。您的计划应:
将“数组”中的每个值加倍(将其存储回内存中的适当位置)
将加倍的值相加,并将总和存储回x。
使用适当的标签将结果和输出到标准输出
我在将总和输出到x时遇到了麻烦,每次我尝试都没有得到结果
@ Our first ARM program
@ x = e + ((a + b) - (c - d))
@ Written by 210 class
我最近学习了软件的详细工作原理。因此,在学习基于Altair 8800的pc并运行它时,他们使用BASIC语言创建了一个解释器,根据处理器指令集将程序翻译成机器代码。他们使用磁带以二进制格式代码向解释器提供信息
但后来他们如何安装解释器是由编译器决定的
直接到硬件,因为他们只理解机器代码
假设我有一个处理器,并且基于我的指令集
再次用汇编语言(使用操作码)开发了一个解释器
我需要将它们转换为机器代码,但如何将它们输入到
处理器内存,是否使用磁带?在今天的
世界有困难吗
他们使用磁带以二进制格
从程序集中的文件中读取一个字节后,当前文件位置将更新。如何修改该字节,然后将其写入文件中读取它的位置?我在塔斯曼x8086上工作
READ_LOOP:
MOV AH,3FH
MOV BX, HANDLE
MOV CX, 1
LEA DX, BUFFER
INT 21H
INC SI
;if no byte was read we reached the end of file or an error occured
CMP AL,
我刚刚开始学习linux 64位汇编,并试图真正理解lea和mov之间的区别。
但是,当创建一个测试文件时,我遇到了一个分段错误,我就是不明白为什么。故障出现在示例代码中的mov r10[rax]上。但是,当我用lea r11,[rax]更改mov r10的位置时,执行lea时,我得到了错误
我的节目:
global _start
section .text
_start:
mov rax,16
lea r11,[rax]
mov r10,[rax]
mov r9,rax
mov rax,6
我对ebp和esp在x86汇编语言中设置堆栈框架的用法有点困惑。在以下代码中:
section '.code' code readable executable ; define the code section of the file
main: ;main label is where execution begins
push ebp
mov ebp,esp ;set up the base ptr
sub ebp,4
我有一个汇编程序,它要求用户输入并打印结果。现在我需要创建一个循环,这样程序将继续提示用户再次输入并计算结果。(例如:输入“是”尝试另一个或输入“否”退出程序。循环需要继续,直到输入“否”。
我是装配新手,正在努力学习。非常感谢您的帮助
.586
.MODEL FLAT
INCLUDE io.h
.STACK 4096
.DATA
n1 DWORD ?
n2 DWORD ?
n3 DWORD ?
prompt1 BYTE "Enter first number", 0
prompt2 B
我正在编写一个汇编代码来获取一个数字,并打印一些文本,打印次数与该数字相同
例如,当输入为4时,我想写“Hello!”4次。
我的代码:
section .data
msg db 'Hello!',0xA
len equ $-msg
section .bss
n resb 1
section .text
global _start
_start:
mov edx, 1
mov ecx, n
mov ebx, 0
mov eax, 3
int
标签: Assembly
hardwaredetectionbootloaderbios
这不是关于BIOS中断int 0x13 ah 0x02(=从驱动器读取扇区)服务的问题
这个问题的重点是
问题1。有没有一种方法可以在不使用BIOS中断的情况下将内存从磁盘读取到RAM(基于传统的引导过程,而不是UEFI)
问题2。如何在不使用BIOS中断的情况下将内存从磁盘读取到RAM
如果有一个方法,在一步一步的方式解释将不胜感激
这个问题的目的是
许多文章断言BIOS是如此过时和不可靠,所以我想避免使用它
如果有方法,它将在第一个引导扇区(0x7C00)中使用
这实际上是不可能的,因为
我有以下从键盘读取数字的代码:
number dw ?
ok db 0
stop db "that's not a number$"
again:
mov ah, 1
int 21h
jmp compare
compare:
cmp al, 0x30
jg greater
mov ok,0
lesser:
mov ok, 1
jmp next
greater:
cmp al, 0x39
jl lesser
mov ok, 0
next:
cmp ok, 1
je go
c
据我所知,处理器中rdtsc和rdtscp指令的运行时顺序的主要区别在于,执行是否等待直到所有以前的指令都在本地执行
换句话说,它意味着lfence+rdtsc=rdtscp,因为rdtsc指令前面的lfence使后面的rdtsc在所有之前的指令本地完成之后执行
然而,我看到了一些示例代码,它们在测量开始时使用rdtsc,在测量结束时使用rdtscp。使用两个rdtsc和rdtsc+rdtscp之间有什么区别吗
lfence
rdtsc
lfence
...
我正在使用gdb检查的引导过程。更具体地说,我在终端中使用qemu和gdb支持运行xv6。在另一个终端中,我正在运行远程连接到qemu存根的gdb
现在,使用si命令单步执行引导过程将产生以下指令
[f000:e05b] 0xfe05b: cmpw $0xffc8,%cs:(%esi)
[f000:e062] 0xfe062: jne 0xd241d416
[f000:e066] 0xfe066: xor %edx,%edx
[f000:e068] 0xf
gnu as支持以$结尾的“额外本地符号”。这些符号未定义,但定义了每个非本地符号。但是下面的代码给出了一个错误,表示符号.L1$正在被重新定义。我使用L1$和.L1$进行了测试,因为一些文档表明以L开头的符号是本地的
以下是gnu中的一个参考文件:
我在常规手册中找不到它,也许这就是问题的一部分。我以为我看到了。这是我的错吗?它不再受支持了吗
.global f
f:
.L1$:
mov r0, #1
bne .L1$
bx
我有以下代码:
IDEAL
MODEL small
STACK 100h
DATASEG
CODESEG
PROC PLAY
mov al, 182
out 43h, al
out 42h, al
mov al, ah
out 42h, al
in al, 61h
or al, 00000
为了便于参考,我在看第4-65节
我正在努力理解参考指南,但我正在尝试使用交错方式将4组4个浮点加载到8个不同的d寄存器(d6-d13)中,如下所示:
从地址r0加载的内存(所有32位浮点):
[a、b、c、d、e、f、g、h、i、j、k、l、m、n、o、p]
d6 = [a,e]
d7 = [i,m]
d8 = [b, f]
d9 = [j, n]
d10 = [c, g]
d11 = [k, o]
d12 = [d,h]
d13 = [l, p]
我试图用下面的说明来实现这一点,但它似乎不
例如。。。
stm32l152的汇编语言(基于cortex m3)和stm32f103的汇编语言是否相同?
基于cortex m3的所有mcu的汇编语言是否相同
我知道外围设备不同,但是汇编语言呢?
不同吗?为了澄清您的问题,指令集和汇编语言之间有一个重要的区别。指令集(顾名思义)是处理器能够理解的指令集。汇编语言是一种低级编程语言,它在助记符和实际指令之间提供(大部分)1:1的对应关系
所有Cortex-M3处理器的指令集都是相同的。它是M4和M4F皮层的子集,是M0和M0+皮层的超集。它还与
我们知道汇编程序是用来把高级语言转换成汇编语言的。所以,如果我们使用高级语言来实现汇编程序,谁来汇编这个汇编程序呢?首先,你所说的“高级语言”通常被称为。现在,您可以说是汇编程序将代码从高级语言翻译成汇编语言。这是错误的:这样的翻译实际上被称为。在编译器将C++代码转换成汇编语言之后,AN将汇编语言代码转换成机器代码。现在,您可以说是汇编程序将代码从高级语言翻译成汇编语言。这是错误的:这样的翻译实际上被称为。在编译器将C++代码转换成汇编语言之后,AN将汇编语言代码转换成机器代码。我的难题是,一
PCMPGTQ在SSE2上不存在,并且本机无法处理无符号整数。我们的目标是为无符号64位比较提供向后兼容的解决方案,以便将它们纳入WebAssembly SIMD标准
这是一个针对ARMv7+NEON的姐妹问题:
与SSE2和Neon已回答的签名比较变体相关的问题:
给你
__m128i cmpgt_epu64_sse2( __m128i a, __m128i b )
{
// Compare uint32_t lanes for a > b and a < b
我不知道何时使用SP寄存器以及何时使用ESP寄存器,此外,我想知道何时使用ESP寄存器,它是否总是减少4而不能减少2?SP是一个16位寄存器,在32位模式下,您必须使用ESP
push和pop指令始终在4字节块中工作,因此不能将堆栈指针减少2。您可以使用子esp,2手动执行此操作,但这样会影响堆栈对齐,这可能会导致显著的性能损失(尤其是在处理堆栈上的浮点值iirc时)
因此,一般来说,除非您有一个非常具体的目标要实现,否则在32位模式下,您使用ESP并将堆栈视为一系列4字节值,SP是一个16位寄
我有一段代码,它读取一个双精度数组,然后做高斯消去,我想把它改成浮点,我的问题是如果我把数组改成浮点,我需要做什么才能让我的程序继续运行
我知道我的数组应该改为.float,在float中我需要使用li$v0,2和lcw1$f12,我正在使用li$v0,3 ldc1$f2,但我一直在更改它,并给出错误的答案我不知道如何做,我正在尝试,但我无法使它工作,请帮助
### Text segment
.eqv n 3
.text
main:
la $a0, array
l
标签: Assembly
appendbit-manipulationendianness
我对汇编还不熟悉,但对编程以及它的总体工作方式并不陌生。因为我已经知道很多语言,所以我决定让我的第一个ASM程序计算输入文件的SHA-1散列。我已经制定了许多单独的部分,但有两个部分我遇到了麻烦;我会在这里寻求帮助
基本上,我对大尾数和小尾数的概念以及如何在ASM中表示它们感到困惑。引用SHA-1 Psuedocode:
append length of message (before pre-processing), in bits,
as 64-bit big-endian integer
我在汇编中遇到了一个问题,我必须获取十六进制代码的第一个字节(FF)并将其复制到整个值上:
0x045893FF input
0xFFFFFFFF output
我所做的是:
movl $0x04580393FF, %eax
shl $24, %eax # to get only the last byte 0xFF000000
现在我想将这个字节复制到寄存器的其余部分。例如,您可以这样做:
mov %al, %ah #0x0458FFFF
mov %ax,
我找不到可以编辑的代码,因此我可以添加两位数而不是一位数,以下是代码:
.model small
.stack 100h
.data
first db 13,10, 'Enter 1st Number: $'
second db 13,10, 'Enter 2nd Number: $'
result db 13,10, 'Result: $'
invalid db 13,10, 'Invalid Number!!! $'
.code
start:
mov ax,03
我不熟悉汇编语言。我试图加上2个整数,只有2个数字,但每当我试图访问num1中的第二个数字时,它就会神秘地访问num2的第一个数字。我需要帮助!我真的不知道为什么。顺便说一句,我正在使用TASM
这是我的密码
;-----------------------
.model small
.stack
.data
num db ?
num2 db ?
result db ?
prompt1 db "Enter 1st number: $"
prompt2 db "Enter 2nd numbe
最近我读了一本书,书中提到“段寄存器的值必须先乘以16”
例如,MOV AL[ES:BX]意味着将ES*16+BX的内容移动到寄存器AL。我在网上搜索了一些文章,也提到了类似的事情:
我只是想知道为什么在这里?16是什么意思
更新:
我的意思是,如果我想访问地址16,MOV BX,16和MOV ES,1都能正常工作吗?这对我来说很奇怪。我认为ES是最左边的位,如果ES是1,那么地址是ES*65536+BX
回到分段内存和16位地址空间的时代,它允许您寻址整个1MB内存,这是原始8086支持的
指令是将结果放在r3中,保持r2不变,还是也会改变r2?只有目标寄存器被修改。子r3,r2,5的字面意思是:r3=r2-5。我不熟悉堆栈溢出。为什么这个问题会被否决?我该如何提问?@Barath:我觉得你的问题还可以,但有些人可能认为你没有利用广泛可用的信息来源进行足够的研究,例如,为了自己回答你的问题,但这只是一个猜测。请注意,为了进行实验,您可以在PC上甚至在Windows上使用()调试arm汇编程序。如果您需要更多详细信息,请随时提问。以下是如何提问的一般指南: