Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Asm: Общие вопросы > Заполнение массива, пока не переполнится...


Автор: fridkaratel 22.10.2007, 08:03
Мне необходимо заполнить массив ячеек факториалами от 1 до N, пока N не будет влезать в 16 разрядов, т.е. пока число вписывается в 16 бит. 
Т.е. должно выглядеть примерно так: 1, 2, 6, 24, 120... 

Я пока только учусь, поэтому извините, если вопрос глупый и простой...  smile 

Автор: Lonley 22.10.2007, 08:41
Флаг переполнения, флаг переноса

Автор: fridkaratel 22.10.2007, 08:48
а можно какой-нибудь код? чтобы разбираться... просто мне подкинули задачку для начинания изучения... решил так сказать проверить - смогу ли я потянуть ASM или нет... 

Если будет работающий код, так я смогу понять, что выполняется и на каком уровне происхдят те или иные операции... ;)

Автор: MAKCim 22.10.2007, 09:08
Код

; FASM code
; cx содержит N
; es:di содержит адрес массива
    xor ax, ax
    inc ax
    xor bx, bx
@@:
    inc bx
    cmp bx, cx
    ja @F
    mul bx
    mov word [es:di], ax
    jnc @B
@@:
...

Автор: fridkaratel 22.10.2007, 09:18
а можно поподробнее описать некоторые операции, например xor, mul и т.д.

Как я понял, cmp - это копирование, mov - перемещение на опр. адрес, inc - увеличение на 1, а остальны что делают?

Автор: MAKCim 22.10.2007, 10:20
fridkaratel, 
xor - исключающее ИЛИ (в данном случае используется для обнуления операнда)
cmp - сравнение операндов и установка соответствующих битов в FLAGS
mul - в данном случае умножение ax на bx, результат в dx:ax, установка CF в FLAGS если dx != 0 (условие выхода)
jnc - переход на первую @@ если CF == 0 (результат поместился в 16 разрядов)
ja - переход на вторую @@ если bx > cx (т. е очередное число превосходит N)

Автор: fridkaratel 22.10.2007, 11:49
большое спасибо! ;) буду разбираться и учиться, чтобы не задавать подобных вопросов ;)

Автор: Mikl_ 16.11.2007, 14:49
Цитата

Мне необходимо заполнить массив ячеек факториалами от 1 до N, пока N не будет влезать в 16 разрядов, т.е. пока число вписывается в 16 бит.
 
fridkaratel, для начала вооружаешься калькулятором -- 2 в 16 степени это  65535
10!=3.628.800 9!=362.880 значит всего 9 шагов, в si индекс массива
Код

. data 
mas dw 9 dup (0)
.code
       mov ax,1
       mov cx,9
       mov si,offset mas 
       mov bx,1
a1: mul bx
       lodsw
       inc bx
       loop a1

Автор: dumb 17.11.2007, 13:38
только таки mov di,offset mas/cld/stosw

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)