gnu汇编btc指令
『壹』 按照GNU汇编程序文件格式,用ARM汇编语言编写程序,求三个数(x,y,z)
请按右下角展开,不然的话网络把回答的内容压缩的很难看.
#地址送入寄存器
ldr r0,x
ldr r1,y
ldr r2,z
#比较x和y谁最小
cmp r0, r1
movle r5,r0 le的意思是less equal,指令的意思是if(x<=y) r5=r0(即x)
movgt r5,r1 gt的意思是greater than,指令的意思是if(x>y) r5=r1(即y)
#r5寄存器保存x,y中的最小值,只要r5和z的值比较一下即可知道最小值
cmp r5,r2
movgt r5,r2 #if(r5 > z) r5=z; 表示若min{x,y} > z,则表示z的值才是最小的,r5=z
这时便可求得最小值并保存在r5寄存器中,知道了最小值怎么写,其实最大值也是依葫芦画瓢,我就不累赘了.上面的代码我没有通过编译器验证,可能存在少量语法问题.但思路就是这样.要进行判断先要用cmp进行比较(arm内部会把比较的结果保存在cpsr中),然后对写下要执行的指令(如mov),并在指令后面添加执行条件(eq,ne,lt,gt等).
还有一个方法,如果C语言不会写,你可以写成C语言的代码,通过gcc -S选项让其编译输出成汇编代码,可以参考编译器是怎么做的.
『贰』 GNU-ARM汇编问题
只懂ARMV7 指令集,编译器arm-none-eabi 。
网络这里没有搞 GNU ARM的。
『叁』 请问汇编andl指令做什么用的,例如andl $-16, %esp是什么意思(gnu汇编器)
and 是将后边两个操作数按位求&,加l表示后边两个操作数是4个字节32bit的
第一个$-16就是一个数-16,4字节int表示为0xfffffff0,第二个%esp是一个寄存器,里边存放的是栈指针所指向的内存地址(4个字节),该命令表示将寄存器里存的4字节地址与0xfffffff0按位就&,并将结果存在寄存器%esp中。
作用应该是调整栈指针的地址
『肆』 ARM GNU汇编的.syntax unified是什么意思
.syntax unified 是一个指示,说明下面的指令是ARM和THUMB通用格式的
8字节对齐可以提高访问速度
『伍』 在GNU,ARM汇编语言中出现的“b.”是什么意思
B指令
B指令的格式为:
B{条件} 目标地址
B指令是最简单的跳转指令。一旦遇到一个 B 指 令,ARM 处理器将立即跳转到给定的目标地址,从那里继续执行。注意存储在跳转指令中的实际值是相对当前PC值的一个偏移量,而不是一个绝对地址,它的值由汇编器来 计算(参考寻址方式中的相对寻址)。它是 24 位有符号数,左移两位后有符号扩展为 32 位,表示的有效偏移为 26 位(前后32MB的地址空间)。以下指令:
B Label ;程序无条件跳转到标号Label处执行
CMP R1,#0 ;当CPSR寄存器中的Z条件码置位时,程序跳转到标号Label处执行
BEQ Label
goodluck 请参考一下arm汇编指令吧
『陆』 gnu汇编 Error: suffix or operands invalid for ***
有两种可能
1、pop/push指令没选对。Linux下的as命令来自 GNU binutils,用的是AT&T汇编语法。根据操作数大小的不同,压栈时应选择push、pushw、pushl、pushq中需要的指令,而不是像Intel汇编那样不管什么东西,全用push来做。
pop指令同样存在类似的popw、popl、popq指令。
2、操作数是不是有问题(AT&T汇编下的表示法和Intel汇编有差别,比如用$来引立即数,这个很可能是你遇到错误的原因)。
要么去用支持Intel汇编语法的汇编程序(如nasm),要么学一下AT&T汇编(如果真打算在Linux下干活,建议学AT&T汇编)。
『柒』 汇编语言分几种分别是什么作用
人与电脑的沟通主要是通过汇编语言来完成,汇编语言具体为
汇编语言(AssemblyLanguage)是面向机器的程序设计语言。在汇编语合中,用助记符(Memoni)代替操作码,用地址符号(Symbol)或标号(Label)代替地址码。这样用符号代替机器语言的二进制码,就把机器语言变成了汇编语言。于是汇编语言亦称为符号语言。使用汇编语言编写的程序,机器不能直接识别,要由一种程序将汇编语言翻译成机器语言,这种起翻译作用的程序叫汇编程序,汇编程序是系统软件中语言处理系统软件。汇编程序把汇编语言翻译成机器语言的过程称为汇编。
要注意的是,汇编语言和机器的cpu是有很大联系的,当然汇编语言也并不全是cpu的指令。
不同架构的CPU指令并不相同,如x86,powerpc,ARM各有各的指令系统;甚至同一种架构的CPU有几套指令集,典型的如arm除了有32位的指令集外,还有一套16位的thumb指令集。但是作为开发语言的汇编,本质上是一套语法规则和助记符的集合,它可以包容不同的指令集。如果从CPU体系来划分,常见的汇编有两种:IBM PC汇编和ARM汇编。
IBM PC汇编也就是Intel的汇编,因为IBM最早推出PC机,后来的体系很多都要和它兼容,所以也使用了相同的汇编语言。ARM压根没考虑过兼容,它的指令集和x86完全是两个体系,所以汇编语言也独立发展出一套。
CPU只是限定了机器码,作为开发语言的汇编,其实还和编译器息息相关。汇编语言出现的早,没有像C语言一样定义出标准,所以编译器的厂商各搞一套。到现在,最有名的也是两家:MASM和GNU ASM。前者是微软的,只支持x86,用在DOS/Windows平台中;后者是开源产品,主要用在Linux中,基本上支持大部分的CPU架构。这两者的区别在于伪指令的不同,伪指令是用来告诉编译器如何工作的,和编译器相关,和CPU无关。
『捌』 利用ARM指令具有条件执行的功能写出下列C代码对应的汇编代码。要求按照ARM汇编程序语法书写。
小学文化胡编一个
.equ a, 1 @ GNU binutils
.equ b, 4
ldr r0, = a
ldr r1, = b
cmp r0, r1
ite gt
addgt r0, r1, # 1
addle r1, r0, # 1
sub r0, r1
.equ i, 0
a: .byte 0, 1, 2, 3, 4, 5, 6, 7, 8, 9
ldr r2, = a
ldr r3, = i
yanshi1:
add r3, # 1
add r4, r2, r3
ldr r5, [r4]
str r4, [r5]
cmp r3, # 10
bne yanshi1
『玖』 汇编 sub 指令 操作顺序是怎样的sub $0x8,%esp 如何解释书上没有这种写法
这是at&t汇编格式 和intel的格式不一样 具体请网络at&t汇编
gnu的东西很多用的是这个at&t格式 比如as gcc内嵌汇编等 当然也有用intel格式的 比如nasm
补充一句 因为你看的书教的是intel格式的 而这个和intel格式不一样 所以你看不懂 正常现象
『拾』 GNU ARM汇编的ittt指令是什么意思
如果r2小于r3执行ittt it下面的三条。
it指令有啊,仔细查查指令吧