Среднее оценок с байтами - PullRequest
       108

Среднее оценок с байтами

0 голосов
/ 27 сентября 2018

Я вычисляю среднее значение 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 голосов
/ 27 сентября 2018

Вы можете изменить переменные в байты, если вы используете другой регистр для добавления.Таким образом, возможно следующее:

g0  db  70
g1  db  100
g2  db  65  

Используйте инструкцию MOVZX и укажите эталонный размер памяти 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 соответственно, поскольку значения были расширены от нуля до полной ширины регистра.

...