带有字节的标记平均值

时间:2018-09-27 16:53:11

标签: assembly x86 64-bit x86-64 yasm

我正在计算3分的平均值:

g0  dw  70
g1  dw  100
g2  dw  65  

xor rax, rax
xor rcx, rcx

mov ax, [g0]
inc rcx

add ax, [g1]
inc rcx 

add ax, [g2]
inc rcx

xor rdx, rdx

idiv rcx

等级不必是单词,因为字节数足以满足平均值的要求,但是总和必须是单词,以避免溢出(使用此算法)。

如何将等级转换为字节?仅使用db是不够的,因为那样的话我必须将ax更改为al,但这最终会导致溢出。 我无法指示mov/add仅从[g*]中提取一个字节,因为这会导致操作数大小不匹配。

我正在使用Yasm。

1 个答案:

答案 0 :(得分:0)

如果使用另一个寄存器进行添加,则可以将变量更改为字节。因此,可能会发生以下情况:

g0  db  70
g1  db  100
g2  db  65  

使用MOVZX instruction并指示memory reference size BYTE

xor rcx, rcx              ; clear counter register and break dependencies

movzx eax, BYTE [g0]      ; movzx loads g0 and fills the upper bytes with zeroes
inc rcx

movzx edx, BYTE [g1]      ; move byte from g1 to dl and zero-extend
add ax, dx                ; add the words
inc rcx 

movzx edx, BYTE [g2]      ; the upper half of RDX is zeroed automatically by this instruction
add ax, dx
inc rcx

xor rdx, rdx

idiv rcx

或者,当然,您可以将axdx寄存器引用分别更改为raxrdx,因为这些值已被零扩展到整个寄存器。宽度。