树莓派ARM64汇编语言程序设计入门实验
<h1 id="实验3-2-查找最大数">实验3-2 查找最大数</h1><h2 id="编写汇编代码并编译运行">编写汇编代码并编译运行</h2>
<p>参照实验参考数给出的代码实现arm64汇编语言实现找出最大数。将最大数设置在中间,为我的学号1320。</p>
<pre><code>.section .data
.align 3
my_data:
.quad 1
.quad 2
.quad 5
.quad 1320
.quad 10
.quad 12
my_data_count:
.quad 6
.align 3
print_data:
.string "big data: %d\n"
.section .text
.globl main
main:
stp x29, x30, !
ldr x0, =my_data
ldr x1, my_data_count
add x4, x0, #40
mov x3, xzr
1:
ldr x2, , #8
cmp x2, x3
csel x3, x2, x3, hi
cmp x0, x4
b.ls 1b
ldr x0, =print_data
mov x1, x3
bl printf
ldp x29, x30, , 16
ret
</code></pre>
<p>然后使用<code>gcc test.S -o test -g --static</code>进行编译<br>
运行结果为找出了最大的数:1320。<br>
汇编程序是和机器语言最近的一种程序设计语言。对应不同的架构,汇编语言也不一样。这个汇编代码为arm64的,和以前学习的MIPS又不一样,更加复杂,功能还要多一些。<br>
截图如下:<br>
<img src="https://img2020.cnblogs.com/blog/1812337/202110/1812337-20211030203412617-741888444.png" alt="" loading="lazy"></p>
<h2 id="使用gdb单步调试汇编程序">使用gdb单步调试汇编程序</h2>
<p>使用<code>gdb --tui ./test</code>来进行调试。<br>
<img src="https://img2020.cnblogs.com/blog/1812337/202110/1812337-20211030204404122-2068641792.png" alt="" loading="lazy"><br>
上图为使用<code>b main</code>在main函数设置断点<br>
<img src="https://img2020.cnblogs.com/blog/1812337/202110/1812337-20211030204516391-975094629.png" alt="" loading="lazy"><br>
上图为使用<code>run</code>开始运行。<br>
<img src="https://img2020.cnblogs.com/blog/1812337/202110/1812337-20211030204554786-319873124.png" alt="" loading="lazy"><br>
上图为使用<code>s</code>单步执行。<br>
<img src="https://img2020.cnblogs.com/blog/1812337/202110/1812337-20211030204704213-1397427018.png" alt="" loading="lazy"><br>
上图为使用<code>info reg</code>查看某寄存器值</p>
<h1 id="实验3-3-通过c语言调用汇编函数">实验3-3 通过C语言调用汇编函数</h1>
<p>编辑两个代码文件:<br>
第一个是arm汇编代码文件compare.S:</p>
<pre><code>.section .text
.globl compare_data
compare_data:
cmp x0, x1
csel x0, x0, x1, hi
ret
</code></pre>
<p>第二个是包含主函数的C代码文件:main.c:</p>
<pre><code>#include <stdio.h>
extern int compare_data(int a, int b);
int main()
{
int val;
val = compare_data(1320,1234);
printf("bigger data is:%d\n",val);
}
</code></pre>
<p>然后使用<code>gcc compare.S main.c -o compare</code>就可以编译。<br>
运行结果:<br>
<img src="https://img2020.cnblogs.com/blog/1812337/202110/1812337-20211030210110286-1841158272.png" alt="" loading="lazy"><br>
由此可见,C和汇编是相通的,只要在两个文件中都把函数做好命名和定义,在编译的时候直接进行编译就可以了。</p>
<h1 id="实验3-4-通过汇编语言调用c函数">实验3-4 通过汇编语言调用C函数</h1>
<p>此实验和3-3很相似,这个就是反过来,比较函数用C写的,主函数用汇编写。<br>
compare.c:</p>
<pre><code>int compare_data(int a, int b)
{
return (a >= b) ? a : b;
}
</code></pre>
<p>main.S</p>
<pre><code>$ cat main.S
.section .data
.align 3
print_data:
.string "bigger data is:%d\n"
.section .text
.globl main
main:
stp x29, x30, !
mov x0, #6
mov x1, #5
bl compare_data
mov x1, x0
ldr x0, =print_data
mov x1, x0
ldr x0, =print_data
bl printf
ldp x29, x30, , 16
ret
</code></pre>
<p>运行结果:<br>
<img src="https://img2020.cnblogs.com/blog/1812337/202110/1812337-20211030211654135-1166733847.png" alt="" loading="lazy"></p>
<h1 id="实验3-5-gcc内联汇编">实验3-5 gcc内联汇编</h1>
<p>内联汇编编译:在C代码中嵌入汇编代码。<br>
代码:</p>
<pre><code>#include <stdio.h>
static int compare_data(int a, int b)
{
int val;
asm volatile(
"cmp %1, %2\n"
"csel %0, %1, %2, hi\n"
: "+r" (val)
: "r" (a), "r"(b)
: "memory");
return val;
}
int main()
{
int val;
val = compare_data(5,6);
printf("big data: %d\n", val);
val = compare_data(1234,1320);
printf("big data: %d\n", val);
}
</code></pre>
<p>运行结果:<br>
<img src="https://img2020.cnblogs.com/blog/1812337/202110/1812337-20211030212745262-2127842706.png" alt="" loading="lazy"></p><br><br>
来源:https://www.cnblogs.com/Ressurection-20191320/p/15487243.html
頁:
[1]