我正在计算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。
答案 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
或者,当然,您可以将ax
和dx
寄存器引用分别更改为rax
和rdx
,因为这些值已被零扩展到整个寄存器。宽度。