Oni*_*zou 1 x86 assembly x86-64
我在x86程序集中编写程序,计算四个等级的平均值.我目前使用的4个寄存器(RAX,RBX,RCX和RDX)举行四个等级,这在我的声明.data部分.我也有quot,rem,total,并ans全部初始化为0.
我的一般方法是将四个寄存器一起添加并将总数存储在total变量中.我原本只打算保持总RAX,可是转念一想将其存储在一个变量,这样我可以重用RAX和RDX.
这是一个好主意还是我为自己生成更多代码?我重置RAX并RDX注册为0,以便我可以将它们用于我的除法计算(总计/ 4).我正在关注的书正在使用RAX和RDX注册,所以我认为这就是我应该做的.
代码未完成,因此忽略IDIV了最后一行.
segment .data
a dq 100
b dq 57
c dq 74
d dq 23
quot dq 0
rem dq 0
total dq 0
ans dq 0
segment .text
global main
main:
mov rax, [a]
mov rbx, [b]
mov rcx, [c]
mov rdx, [d]
add rax, rbx
add rcx, rdx
add rax, rcx
mov [total], rax
mov rax, 0
mov rdx, 0
mov rax, [total]
mov rdx, 0
Run Code Online (Sandbox Code Playgroud)
没有对错,除非你人为地将自己限制在比可用的更少的寄存器上,否则你将添加操作码并使代码膨胀.仅使用编码操作所需的寄存器数量.
但是,如果需求发生变化并且您必须处理100个等级,请考虑将会发生什么.或者1000.或者N ..这可能激发你以不同的方式实现你的逻辑.也许考虑使用堆栈来存储成绩?
PS:从架构的角度来看,这里主要关注的是平衡溢出/恢复寄存器的缓存和操作码开销.这个决定在这里并不适用,因为你泄漏的任何数量的寄存器(手工编码)都应该在L1缓存中.实际上,当你的实现用完了寄存器而你开始不得不添加溢出操作码时.