Форум программистов
 
О проблемах, например, с регистрацией пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail, а тут можно восстановить пароль.

Вернуться   Форум программистов > Низкоуровневое программирование > Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM
Регистрация

Восстановить пароль
Повторная активизация e-mail

Здесь нужно купить рекламу за 20 тыс руб в месяц! ) пишите сюда - alarforum@yandex.ru
Без учёта ботов - 20000 человек в день, 350000 в месяц.

Ответ
 
Опции темы
Старый 31.03.2019, 17:02   #1
neponimaushimen
 
Регистрация: 31.03.2019
Сообщений: 8
По умолчанию Turbo Assembler - аналог цикла FOR

Здравствуйте, помогите пожалуйста написать цикл for
Есть код на С
Код:
int x = 0;
for (int i = 0; i <= 50; i++)
{
    x += 2 * (i - x);
}
neponimaushimen вне форума Ответить с цитированием
Старый 31.03.2019, 20:07   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,260
По умолчанию

Цитата:
Сообщение от neponimaushimen Посмотреть сообщение
написать цикл for
примерно так:

Код:
        mov cx,51 ; количество повторов
        mov x, 0 ; для накопления суммы
        mov i, 0 ; 

myfor1:
        <тут вычисления - тело цикла>
        add i, 1
        loop myfor1
Serge_Bliznykov вне форума Ответить с цитированием
Старый 31.03.2019, 20:38   #3
neponimaushimen
 
Регистрация: 31.03.2019
Сообщений: 8
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
примерно так:

Код:
        mov cx,51 ; количество повторов
        mov x, 0 ; для накопления суммы
        mov i, 0 ; 

myfor1:
        <тут вычисления - тело цикла>
        add i, 1
        loop myfor1
у меня есть тоже задатки так скажем, но все равно что то не особо получилось
если разбираешься, можешь глянуть?
Код:
.model small
.stack 100h
.data 
x db 0
i db 0
.code 
    start: 
        mov eax, x
        mov ecx, i
        
        for_begin:
        
        mov al,2 ; я преоброзовал х как x=2*i-x
        mul ecx
        sub ecx,eax
        
        for_end    
inc ecx
cmp ecx, 50
jbe start

Последний раз редактировалось neponimaushimen; 31.03.2019 в 20:40.
neponimaushimen вне форума Ответить с цитированием
Старый 31.03.2019, 20:59   #4
neponimaushimen
 
Регистрация: 31.03.2019
Сообщений: 8
По умолчанию

Попробовал как ты посоветовал, выводит пустоту. Может с телом цикла что то не так?
Код:
.model small
.stack 100h
.code 
    start:
    mov cx, 51
    mov ax,0
    mov dx,0
       
        for_begin:
        
        mov al,2
        mul dx
        sub dx,ax
           
        add dx, 1
        loop start 
        end start
neponimaushimen вне форума Ответить с цитированием
Старый 31.03.2019, 23:05   #5
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,260
По умолчанию

Цитата:
Сообщение от neponimaushimen Посмотреть сообщение
Попробовал как ты посоветовал, выводит пустоту.
так а где собственно вывод?
или это делается в отладчике ?
Serge_Bliznykov вне форума Ответить с цитированием
Старый 01.04.2019, 08:08   #6
R71MT
Участник клуба
 
Аватар для R71MT
 
Регистрация: 16.06.2011
Сообщений: 1,392
По умолчанию

Цитата:
Сообщение от neponimaushimen Посмотреть сообщение
Может с телом цикла что то не так?
Код:
int x = 0;
for (int i = 0; i <= 50; i++)
{
    x += 2 * (i - x);
}
Если наложить это на регистры асм'а, то получится:

i = ecx (счётчик)
x = eax (результат)


поскольку от счётчика(i) нужно отнимать результат(x), будем запоминать счётчик цикла в каком-нибудь регистре - используем для этого регистр(ebx).
Код:
start:
      xor   eax,eax     ; int x = 0
      xor   ecx,ecx     ; int i = 0
; начало цикла for
@00:  mov   ebx,ecx     ; запомним счётчик в ebx
      sub   ebx,eax     ; ebx = (i - x)
      shl   ebx,1       ; ebx * 2
      mov   eax,ebx     ; x = 2 * (i - x)
      inc   ecx         ; инкремент счётчика (i++)
      cmp   ecx,50      ; проверить его на 50
      jnz   @00         ; повторить, если счётчик не равен 50
по окончании цикла получаем EAX = 38E38E5A hex, или 954437210 dec.
Изображения
Тип файла: png 080907.png (11.7 Кб, 107 просмотров)
Нашедшего выход - затаптывают первым..
R71MT вне форума Ответить с цитированием
Старый 01.04.2019, 08:15   #7
neponimaushimen
 
Регистрация: 31.03.2019
Сообщений: 8
По умолчанию

Цитата:
Сообщение от R71MT Посмотреть сообщение
Код:
int x = 0;
for (int i = 0; i <= 50; i++)
{
    x += 2 * (i - x);
}
Если наложить это на регистры асм'а, то получится:

i = ecx (счётчик)
x = eax (результат)


поскольку от счётчика(i) нужно отнимать результат(x), будем запоминать счётчик цикла в каком-нибудь регистре - используем для этого регистр(ebx).
Код:
start:
      xor   eax,eax     ; int x = 0
      xor   ecx,ecx     ; int i = 0
; начало цикла for
@00:  mov   ebx,ecx     ; запомним счётчик в ebx
      sub   ebx,eax     ; ebx = (i - x)
      shl   ebx,1       ; ebx * 2
      mov   eax,ebx     ; x = 2 * (i - x)
      inc   ecx         ; инкремент счётчика (i++)
      cmp   ecx,50      ; проверить его на 50
      jnz   @00         ; повторить, если счётчик не равен 50
по окончании цикла получаем EAX = 38E38E5A hex, или 954437210 dec.
спасибо
но разве в цикле результат не 50 равен?
neponimaushimen вне форума Ответить с цитированием
Старый 01.04.2019, 08:18   #8
R71MT
Участник клуба
 
Аватар для R71MT
 
Регистрация: 16.06.2011
Сообщений: 1,392
По умолчанию

так посчитай в уме (или калькулятором), сколько будет..
где-то на третьей итерации уже уходит в минус, и так плавает то в плюс, то в минус
Нашедшего выход - затаптывают первым..
R71MT вне форума Ответить с цитированием
Старый 01.04.2019, 08:20   #9
R71MT
Участник клуба
 
Аватар для R71MT
 
Регистрация: 16.06.2011
Сообщений: 1,392
По умолчанию

в выражении есть скобки,
поэтому сначала отнимаешь, а потом скобку умножаешь на 2
Нашедшего выход - затаптывают первым..
R71MT вне форума Ответить с цитированием
Старый 01.04.2019, 08:31   #10
neponimaushimen
 
Регистрация: 31.03.2019
Сообщений: 8
По умолчанию

Цитата:
Сообщение от R71MT Посмотреть сообщение
в выражении есть скобки,
поэтому сначала отнимаешь, а потом скобку умножаешь на 2
огромное спасибо
neponimaushimen вне форума Ответить с цитированием
Ответ

Здесь нужно купить рекламу за 20 тыс руб в месяц! ) пишите сюда - alarforum@yandex.ru
Без учёта ботов - 20000 человек в день, 350000 в месяц.

Опции темы


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
TASM (Turbo assembler) - Посмотреть код, указать на ошибки dimwow Помощь студентам 2 02.06.2019 03:19
Turbo Assembler/Перевод десятичного числа в двоичное Equality Помощь студентам 0 03.03.2014 23:24
turbo assembler/exe->com narco3 Помощь студентам 2 17.02.2013 11:04
Программа в Turbo Assembler 4atik Помощь студентам 2 28.12.2012 08:28
График функции на языке TURBO ASSEMBLER - (tasm) максат Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 9 02.06.2011 13:37


Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru
Пеллетный котёл Emtas
котлы EMTAS