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

Вернуться   Форум программистов > Низкоуровневое программирование > Assembler
Регистрация

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

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

Здравствуйте, помогите пожалуйста написать цикл for
Есть код на С
Код:

int x = 0;
for (int i = 0; i <= 50; i++)
{
    x += 2 * (i - x);
}

neponimaushimen вне форума   Ответить с цитированием
Старый 31.03.2019, 21:07   #2
Serge_Bliznykov
МегаМодератор
СуперМодератор
 
Регистрация: 09.01.2008
Сообщений: 25,059
Репутация: 5536
По умолчанию

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

Код:

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

myfor1:
        <тут вычисления - тело цикла>
        add i, 1
        loop myfor1

Serge_Bliznykov вне форума   Ответить с цитированием
Старый 31.03.2019, 21:38   #3
neponimaushimen
 
Регистрация: 31.03.2019
Сообщений: 8
Репутация: 10
По умолчанию

Цитата:
Сообщение от 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 в 21:40.
neponimaushimen вне форума   Ответить с цитированием
Старый 31.03.2019, 21:59   #4
neponimaushimen
 
Регистрация: 31.03.2019
Сообщений: 8
Репутация: 10
По умолчанию

Попробовал как ты посоветовал, выводит пустоту. Может с телом цикла что то не так?
Код:

.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 вне форума   Ответить с цитированием
Старый 01.04.2019, 00:05   #5
Serge_Bliznykov
МегаМодератор
СуперМодератор
 
Регистрация: 09.01.2008
Сообщений: 25,059
Репутация: 5536
По умолчанию

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

Цитата:
Сообщение от 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 Кб, 15 просмотров)
__________________
Нашедшего выход - затаптывают первым..
R71MT вне форума   Ответить с цитированием
Старый 01.04.2019, 09:15   #7
neponimaushimen
 
Регистрация: 31.03.2019
Сообщений: 8
Репутация: 10
По умолчанию

Цитата:
Сообщение от 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, 09:18   #8
R71MT
Профессионал
 
Аватар для R71MT
 
Регистрация: 16.06.2011
Адрес: Фергана
Сообщений: 1,280
Репутация: 1026
По умолчанию

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

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

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

Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
TASM (Turbo assembler) - Посмотреть код, указать на ошибки dimwow Помощь студентам 1 14.03.2017 11:26
Turbo Assembler/Перевод десятичного числа в двоичное Equality Помощь студентам 0 04.03.2014 00:24
turbo assembler/exe->com narco3 Помощь студентам 2 17.02.2013 12:04
Программа в Turbo Assembler 4atik Помощь студентам 2 28.12.2012 09:28
График функции на языке TURBO ASSEMBLER - (tasm) максат Assembler 9 02.06.2011 14:37


04:49.


Powered by vBulletin® Version 3.8.11
Copyright ©2000 - 2019, Jelsoft Enterprises Ltd.

RusProfile.ru


Справочник российских юридических лиц и организаций.
Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru