Среднее значение 10 чисел на языке ассемблера - PullRequest
0 голосов
/ 06 августа 2020

Я пытаюсь найти среднее из 10 чисел в сборке, но не получаю правильного ответа. В чем может быть ошибка?

Я только начал использовать язык ассемблера, поэтому, пожалуйста, не предлагайте более промежуточные уровни кода. Приветствуются любые изменения, внесенные в упомянутый код.

org 100h

mov bx, 5000h 


mov [bx], 10h

inc bx 

mov [bx], 20h

inc bx

mov [bx], 30h 

inc bx

mov [bx], 40h

inc bx 

mov [bx], 50h

inc bx

mov [bx], 60h 

inc bx

mov [bx], 70h

inc bx 

mov [bx], 80h

inc bx

mov [bx], 90h 

inc bx

mov [bx], 100h



mov al, 0h

mov cx, 10h


lab: add al, [bx]

dec bx

loop lab



mov bl, 10h

div bl

Ответы [ 2 ]

3 голосов
/ 06 августа 2020

10h - шестнадцатеричная константа со значением 16.

mov cx, 10h

Загружает 16 в CX, поэтому l oop загружает 16 чисел, 6 (или 5, см. Ниже) за концом вашего массива.

mov bl, 10h

Загружает 16 в BL, поэтому вы делите на 16.

Точно так же загружаемые вами константы не 10, 20,. .. 100, они 16, 32, ... 256.

Обратите внимание, что 256 не помещается в один байт, поэтому это не сохраняет значение 256 в одном байте по адресу BX, так как это невозможно.

Вы берете среднее значение из 16 чисел. Первые 9 из них - это те, которые вам нужны, следующие два - это два байта 0x00 и 0x01 (0x100 хранится как два байта), а следующие 5 - это все, что находится в памяти.

Обозначаются шестнадцатеричные константы суффиксом h.

Другая проблема заключается в том, что сумма добавляемых вами чисел не помещается в один байт, поэтому их накопление в AL не сработает.

2 голосов
/ 06 августа 2020

Во-первых, все ваши числа имеют в конце букву «h», что означает, что они шестнадцатеричные числа. Таким образом, вы сохраняете не 10, 20, 30, et c, а 16, 32, 48, et c. Это означает, например, что mov cx, 10h фактически устанавливает cx равным 16, а не 10. Десятичным константам не нужен суффикс.

Во-вторых, при сложении чисел результат будет больше 255, что означает, что он не может поместиться в один байт. Вам нужно будет использовать ax вместо al, чтобы отслеживать сумму. Обратите внимание, это также означает, что вам нужно изменить сложение l oop, чтобы преобразовать каждый байт в слово.

Вот как выглядит обновленный l oop:

mov ax, 0
mov cx, 10
mov dh, 0

lab: mov dl, [bx]
add ax, dx
dec bx
loop lab

mov bl, 10
div bl

Здесь я использовал dx для преобразования байта в слово, установив dh на 0, а затем добавил dx к ax.

...