汇编实战:使用codewars刷题

不多说,直接开冲

众所周知,汇编语言有多种,可以分为精简指令集和复杂指令集,具体包括RISC-V和x86等等. 而x86汇编是非常常见的,

如果你使用RISC-V,你不太能将Linux运行在上面。相应的,大多数现代计算机都运行在x86和x86-64处理器上。x86拥有一套不同的指令集,看起来与RISC-V非常相似。通常个人电脑上运行的处理器是x86,Intel和AMD的CPU都实现了x86

这两者之间有一些关键的区别:

  1. 首先是指令的数量。实际上,创造RISC-V的一个非常大的初衷就是因为Intel手册中指令数量太多了。x86-64指令介绍由3个文档组成,并且新的指令以每个月3条的速度在增加。因为x86-64是在1970年代发布的,所以现在有多于15000条指令。RISC-V指令介绍由两个文档组成。
  2. 除此之外,RISC-V指令也更加简单.在x86-64中,很多指令都做了不止一件事情。这些指令中的每一条都执行了一系列复杂的操作并返回结果。但是RISC-V不会这样做,RISC-V的指令趋向于完成更简单的工作,相应的也消耗更少的CPU执行时间。这其实是设计人员的在底层设计时的取舍。并没有一些非常确定的原因说RISC比CISC更好。它们各自有各自的使用场景。
  3. 相比x86来说,RISC另一件有意思的事情是它是开源的。这是市场上唯一的一款开源指令集,这意味着任何人都可以为RISC-V开发主板。RISC-V是来自于UC-Berkly的一个研究项目,之后被大量的公司选中并做了支持,网上有这些公司的名单,许多大公司对于支持一个开源指令集都感兴趣。

image-20240924160835867

关于所谓RISC和CISC之争都2021年了,还把x86和ARM归为CISC和RISC? - 知乎 (zhihu.com)

RISC-V指令集简介

  • .data 段包含已初始化的全局变量 result
  • .bss 段可以用于定义未初始化的全局变量(如果需要)
  • 在RISC-V汇编中,使用 .text 指令来定义代码段的开始。通常,代码段的入口点会用 .global 指令声明,以便链接器知道程序的入口点

image-20240925121842594

调用约定

image-20240925194721571

x86指令集简介

img

image-20240925200447996

调用约定

img

Guide to x86 Assembly (virginia.edu)

x86 and amd64 instruction reference (felixcloutier.com)

汇编语言—x86汇编指令集大全 - 知乎 (zhihu.com)

x86汇编指令集大全(带注释)_x86处理器32位的指令集中文文档-CSDN博客

做做题

推荐使用codewars刷刷题,可以使用NASM(x86汇编器)或者RISC-V

Q1

Complete the function that takes two integers (a, b, where a < b) and return an array of all integers between the input parameters, including them.

1
2
3
4
5
6
7
8
9
.global between

# <-- between(A0 <int> a, A1 <int> b, [word A2] <int *> integers) -->
between:
sw a0, (a2)
addi a0,a0,1
addi a2,a2,4
ble a0,a1,between
ret

Q2

Your classmates asked you to copy some paperwork for them. You know that there are ‘n’ classmates and the paperwork has ‘m’ pages.

Your task is to calculate how many blank pages do you need. If n < 0 or m < 0 return 0.

1
2
3
4
5
6
7
8
.global paperwork

# int paperwork(int n, int m)
paperwork:
max a0, a0, zero
max a1, a1, zero
mul a0, a0, a1
ret

Q3

Given a string, you have to return a string in which each character (case-sensitive) is repeated once.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
double_char:
mv t0,a1
loop_start:
lb t1,0(a0)
beqz t1,end
sb t1, 0(a1)
sb t1, 1(a1)
addi a0, a0, 1
addi a1, a1, 2
j loop_start
end:
sb x0, 0(a1)
mv a0,t0
ret

参考资料

  1. https://github.com/sunshaoce/learning-riscv
  2. 5.2 RISC-V vs x86 | MIT6.S081 (gitbook.io)
  3. Release Release riscv-isa-release-e867a4e-2024-09-24 · riscv/riscv-isa-manual (github.com)
  4. riscv-spec.pdf (mit.edu)
  5. X86、ARM、RISC-V,MIPS傻傻分不清楚?一文带你看懂! - 知乎 (zhihu.com)
-------------本文结束感谢您的阅读-------------
感谢阅读.

欢迎关注我的其它发布渠道