1

Тема: (Assembler)Допоможіть реалізувати цикл Loop в готовій програмі

org 100h
jmp start

a   db  2
b   db  3
z   db  4
    
start:  
     

    
    ; calc 2a / z^2 
    mov     al, z  
    cbw
    imul    ax   ; ax = z * z
    push    ax
    pop     bx   ; bx = z^2
    
    mov     al, a
    add     al, [a]
    cbw     ; ax = 2a
                     
    xor     dx, dx
    idiv    bx      ; ax = 2a / z^2   
    
    push    ax      ; push ax in stack
    
    ; calc  b^3 / 3a
    mov     bl, 3
    mov     al, a
    cbw
    imul    bl      ; ax = 3a
    
    push    ax
    pop     bx
    
    mov     al, b
    cbw
    imul    [b]
    imul    [b]     ; ax= b^3
    
    xor     dx, dx
    idiv    bx      ;ax = b^3 / 3a
    
    ; calc  (2a / z^2) - (b^3 / 3a) 
    pop     bx      ; bx = 2a / z^2
    sub     bx, ax  ; bx =  (2a / z^2) - (b^3 / 3a)
    
    push    bx      ; res to stack
            
    ;calc   a^4 * b^2 
    mov     al, b
    cbw
    imul    ax      ; ax = b^2  
     
    push    ax
    pop     bx                              
                              
    mov     al, a
    cbw
    imul    ax      ; ax = a^2
    imul    ax      ; ax = a^4
    
    imul    bx      ; ax = a^4 * b^2
    
    pop     bx      ; bx =  (2a / z^2) - (b^3 / 3a)                 
    xor     dx, dx
    idiv    bx      ;ax =  ( a^4 * b^2) / ((2a / z^2) - (b^3 / 3a))
    
    push    ax
    
    ; calc a^2 / b^2
    
    mov     al, b
    cbw
    imul    ax      ; ax = b^2
    xchg    ax, bx
    mov     al, a
    cbw
    imul    ax      ; ax = a^2
    xor     dx, dx
    idiv    bx      ; ax = a^2 / b^2
    
    pop     bx
    add     ax, bx  ; ax = result
    
      
    call    print
       
    mov     ah, 0 
    int     16h 
       
; print sym
sym:    
    push ax
    mov ah, 02h
    int 21h
    pop ax
    ret
           
; print number
print:
    mov cx, 0
    mov bx, 10
    cmp ax, 0
    jge @next 
    neg ax     
    mov dl, '-'
    call sym
@next:
    xor dx, dx
    div bx
    add dl, '0'
    push dx   
    inc cx  
    cmp ax, 0
jne @next  
    
@out:
    pop dx
    call sym
loop @out       
ret 
       
ret

2

Re: (Assembler)Допоможіть реалізувати цикл Loop в готовій програмі

Так а що треба зациклити? Тим паче цикл присутній

Подякували: MMORPG1

3

Re: (Assembler)Допоможіть реалізувати цикл Loop в готовій програмі

Chemist-i написав:

Так а що треба зациклити? Тим паче цикл присутній

Потрібно зробити саме через Loop.

Але ще не до кінця добре розумію
Як реалізувати цей цикл тут (Loop)

4

Re: (Assembler)Допоможіть реалізувати цикл Loop в готовій програмі

А це що, як не цикл loop?

@out:
    pop dx
    call sym
loop @out  
Подякували: MMORPG1

5

Re: (Assembler)Допоможіть реалізувати цикл Loop в готовій програмі

P.Y. написав:

А це що, як не цикл loop?

@out:
    pop dx
    call sym
loop @out  

Тупанув)

Не правильно написав потрібно *втикнути* Loop в самі обрахунки

  ; calc 2a / z^2 
    mov     al, z  
    cbw
    imul    ax   ; ax = z * z
    push    ax
    pop     bx   ; bx = z^2
    
    mov     al, a
    add     al, [a]
    cbw     ; ax = 2a
                     
    xor     dx, dx
    idiv    bx      ; ax = 2a / z^2   
    
    push    ax      ; push ax in stack
    
    ; calc  b^3 / 3a
    mov     bl, 3
    mov     al, a
    cbw
    imul    bl      ; ax = 3a
    
    push    ax
    pop     bx
    
    mov     al, b
    cbw
    imul    [b]
    imul    [b]     ; ax= b^3
    
    xor     dx, dx
    idiv    bx      ;ax = b^3 / 3a
    
    ; calc  (2a / z^2) - (b^3 / 3a) 
    pop     bx      ; bx = 2a / z^2
    sub     bx, ax  ; bx =  (2a / z^2) - (b^3 / 3a)
    
    push    bx      ; res to stack
            
    ;calc   a^4 * b^2 
    mov     al, b
    cbw
    imul    ax      ; ax = b^2  
     
    push    ax
    pop     bx                              
                              
    mov     al, a
    cbw
    imul    ax      ; ax = a^2
    imul    ax      ; ax = a^4
    
    imul    bx      ; ax = a^4 * b^2
    
    pop     bx      ; bx =  (2a / z^2) - (b^3 / 3a)                 
    xor     dx, dx
    idiv    bx      ;ax =  ( a^4 * b^2) / ((2a / z^2) - (b^3 / 3a))
    
    push    ax
    
    ; calc a^2 / b^2
    
    mov     al, b
    cbw
    imul    ax      ; ax = b^2
    xchg    ax, bx
    mov     al, a
    cbw
    imul    ax      ; ax = a^2
    xor     dx, dx
    idiv    bx      ; ax = a^2 / b^2
    
    pop     bx
    add     ax, bx  ; ax = result
    
      
    call    print
       
    mov     ah, 0 
    int     16

Але не розумію
Куди його тут впихнути.....
Але таке завдання

6

Re: (Assembler)Допоможіть реалізувати цикл Loop в готовій програмі

Основне призначення циклу loop — виконання серії однакових дій, кількість повторів яких наперед відома. В даному випадку, наприклад, можна було б зробити функцію, що обчислює степені, роблячи це шляхом повторів множення: щоб отримати xn, записуємо 1 в акумулятор і домножуємо на x стільки разів, скільки задано в n.

Подякували: MMORPG1

7 Востаннє редагувалося MMORPG (14.11.2020 14:10:44)

Re: (Assembler)Допоможіть реалізувати цикл Loop в готовій програмі

P.Y. написав:

Основне призначення циклу loop — виконання серії однакових дій, кількість повторів яких наперед відома. В даному випадку, наприклад, можна було б зробити функцію, що обчислює степені, роблячи це шляхом повторів множення: щоб отримати xn, записуємо 1 в акумулятор і домножуємо на x стільки разів, скільки задано в n.

Зрозіміло.

Можете навести приклад? Або дати посилання на нього.

8

Re: (Assembler)Допоможіть реалізувати цикл Loop в готовій програмі

    mov     al, b
    cbw
    imul    [b]
    imul    [b]     ; ax= b^3

    mov     al, b
    mov     dl, 2

M1:  imul    [b]   
  
    loop M1    

Як зробити?
Щоб дія Loop закінчувалася
Після повторення другого разу
Бо тут йде маленьке зациклення)

9

Re: (Assembler)Допоможіть реалізувати цикл Loop в готовій програмі

Хмм... Загуглив "loop assembler".

Інструкція LOOP передбачає, що регістр ECX містить в собі лічільник циклів. Коли інструкція циклу виконується, регістр ECX зменшується, точка виконання програми переходить до мітки до тих пір, поки значенння регістру ECX (тобто значення лічильника циклу) не досягне 0.

mov ECX,10
l1:
<loop body>
loop l1

Водночас на іншому сайті замість ECX cl. Не знайшов він сам зменшується, чи потрібно зменшувати командами. Якщо сам то

mov ecx, 2
M1:  imul    [b]   
  
    loop M1  
Подякували: MMORPG1

10

Re: (Assembler)Допоможіть реалізувати цикл Loop в готовій програмі

loop не вміє робити нескінченні цикли (принаймні, якщо в ньому всередині не змінювати cx явним чином). Що взагалі робить loop? Зменшує cx на 1, і якщо cx при цьому не стає нулем, то переходить на мітку. Перед циклом запишіть у cx потрібну вам кількість повторів — і буде вам щастя.

Подякували: drosorov2, MMORPG, leofun013

11

Re: (Assembler)Допоможіть реалізувати цикл Loop в готовій програмі

Чому саме cx?

Подякували: MMORPG1

12

Re: (Assembler)Допоможіть реалізувати цикл Loop в готовій програмі

Дякую вам!!

13

Re: (Assembler)Допоможіть реалізувати цикл Loop в готовій програмі

drosorov2 написав:

Хмм... Загуглив "loop assembler".

Інструкція LOOP передбачає, що регістр ECX містить в собі лічільник циклів. Коли інструкція циклу виконується, регістр ECX зменшується, точка виконання програми переходить до мітки до тих пір, поки значенння регістру ECX (тобто значення лічильника циклу) не досягне 0.

mov ECX,10
l1:
<loop body>
loop l1

Водночас на іншому сайті замість ECX cl. Не знайшов він сам зменшується, чи потрібно зменшувати командами. Якщо сам то

mov ecx, 2
M1:  imul    [b]   
  
    loop M1  

Так, loop зменшує лічильник сам — додатково робити декремент непотрібно.
Вибір між CX та ECX залежить від системи команд — якщо програму скомпільовано для 386, використовується ECX, якщо для 8086 — CX. Регістр CL є молодшим байтом цього регістру — таким чином, якщо CX/ECX попередньо знулити, а кількість повторів не перевищує 255, то можна записувати кількість повторів у CL (оскільки старші байти при цьому все одно лишатимуться нульовими)

Подякували: MMORPG, drosorov2, leofun013

14

Re: (Assembler)Допоможіть реалізувати цикл Loop в готовій програмі

drosorov2 написав:

Чому саме cx?

Напевно через інше середовище в мене Emu 8086

і при вводі ecx вибиває помилку.

15

Re: (Assembler)Допоможіть реалізувати цикл Loop в готовій програмі

Навіщо емулятор, якщо є fasm (portable)
https://flatassembler.net/download.php

Подякували: MMORPG1

16

Re: (Assembler)Допоможіть реалізувати цикл Loop в готовій програмі

drosorov2 написав:

Навіщо емулятор, якщо є fasm (portable)
https://flatassembler.net/download.php

Завдання від викладача

Все робити в Emu 8086)

17 Востаннє редагувалося P.Y. (14.11.2020 16:15:17)

Re: (Assembler)Допоможіть реалізувати цикл Loop в готовій програмі

P.Y. написав:

loop не вміє робити нескінченні цикли (принаймні, якщо в ньому всередині не змінювати cx явним чином).

Хоча два loop'и — вміють:

l:
    loop l1 ; cx зменшуватиметься, поки не стане нулем
    ; У цьому місці cx матиме значення 0 завжди — внаслідок роботи попереднього loop
    loop l1 ; cx зменшується на 1, а оскільки там вже був 0, то отримуємо 0FFFFh і переходимо на початок циклу...
Подякували: drosorov21

18

Re: (Assembler)Допоможіть реалізувати цикл Loop в готовій програмі

Колись хотів якийсь соурс для windows зкомпілити, намагався поставити masm, nasm, turbo, але чомусь не вийшло. Вдалося запустити тільки якийсь асемблер для dos, але той соурс він не компілив. А потім випадково знайшов fasm, він запрацював без встановлення. Правда соурс так і не зкомпілився. Але я з цікавості відкрив папку з прикладами програм і знайшов в соурсі команду invoke (для виклику імпортованих з dll підпрограм). Виявилося, воно зручніше ніж rundll32.exe бо без дизасемблера його не прочитати, не у кожного він є. fasm використовую зараз для цього.

19

Re: (Assembler)Допоможіть реалізувати цикл Loop в готовій програмі

drosorov2 написав:

Колись хотів якийсь соурс для windows зкомпілити, намагався поставити masm, nasm, turbo, але чомусь не вийшло. Вдалося запустити тільки якийсь асемблер для dos, але той соурс він не компілив. А потім випадково знайшов fasm, він запрацював без встановлення. Правда соурс так і не зкомпілився. Але я з цікавості відкрив папку з прикладами програм і знайшов в соурсі команду invoke (для виклику імпортованих з dll підпрограм). Виявилося, воно зручніше ніж rundll32.exe бо без дизасемблера його не прочитати, не у кожного він є. fasm використовую зараз для цього.

Ахахаха ... ложкою у вухо лізе...

Подякували: cheappi3861

20

Re: (Assembler)Допоможіть реалізувати цикл Loop в готовій програмі

дуже давно в асм не лазив, але мушу спитати - чому цикл а не умовний перехід ?