Ассемблер. Помогите пжл написать код для вычисления выражения x+y*z/65536

Ассемблер. Помогите пжл написать код для вычисления выражения x+y*z/65536

  • делить на 65536 не надо. вместо этого нужно сдвинуть число вправо на 16 бит. а в данном случае, когда старшие 16 бит уже находятся в отдельном регистре dx, даже ничего делать не придется
    итак, если все переменные x, y, z - 16битные:
    mov ax, word ptr [y]
    mul word ptr [z] ; или imul для чисел со знаком
    add ax, word ptr [x] ; добавляем x к младшему слову
    adc dx, 0 ; добавляем к старшему слову 0, если при предыдущей операции не произошло переноса. иначе добавляем 1
    ;например
    ;dx:ax = 000F:FFFF
    ;добавляем к ax единицу, получаем 000F:0000. так как произошел перенос, флаг CF установлен в 1
    ;добавляем к dx ноль + СF, получаем 0010:0000 как и должно быть, потому, что 0xFFFFF+1=100000

    конечный результат вычисления будет в dx

    если же переменные 32битные, лучше воспользоваться 32битными регистрами. благо на дворе 21 век и процессор 80286 можно встретить пожалуй только в музее
    mov eax, dword ptr [y]
    mul dword ptr [z] ; или imul для чисел со знаком
    add eax, dword ptr [x]
    shr eax, 16; или sar для чисел со знаком. сдвигаем число на 16 бит вправо. (т.е. делим на 65536)

    результат в eax