Форум программистов, компьютерный форум, киберфорум
Assembler для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/8: Рейтинг темы: голосов - 8, средняя оценка - 5.00
Maria ->∞
106 / 86 / 44
Регистрация: 27.08.2013
Сообщений: 1,277
Записей в блоге: 1
1

Вывод Hello World в цикле 10 раз

16.02.2014, 20:09. Просмотров 1667. Ответов 5
Метки нет (Все метки)

Задача: Модифицировать текст программы так, чтобы надпись выводилась на экран 10 раз. Указание: для выполнения задачи достаточно добавить LOOP в нужном месте, при этом не требуется детально разбираться с текстом программы.

Если не сложно поясните вкратце код...

Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
! Simple "hello world" program
! See section 9.8.1.
 
    _EXIT   = 1     !  1
    _WRITE  = 4     !  2
    _STDOUT = 1     !  3
.SECT .TEXT         !  4
start:              !  5
    MOV CX,de-hw    !  6
    PUSH    CX      !  7
    PUSH    hw      !  8
    PUSH    _STDOUT     !  9
    PUSH    _WRITE      ! 10
    SYS         ! 11
    ADD SP,8        ! 12
    SUB CX,AX       ! 13
    PUSH    CX      ! 14
    PUSH    _EXIT       ! 15
    SYS         ! 16
.SECT .DATA         ! 17
hw:             ! 18
.ASCII  "Hello World\n"     ! 19
de: .BYTE   0       ! 20
.SECT .BSS
Все мои попытки были неудачны...Там CX не уменьшается и происходит зацикливание.Вот мой код.
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
! Simple "hello world" program
! See section 9.8.1.
 
    _EXIT   = 1     !  1
    _WRITE  = 4     !  2
    _STDOUT = 1     !  3
.SECT .TEXT         !  4
        MOV CX, 10
start:              !  5
    MOV CX,de-hw    !  6
    PUSH    CX      !  7
    PUSH    hw      !  8
    PUSH    _STDOUT     !  9
    PUSH    _WRITE      ! 10
    SYS         ! 11
        LOOP start
    ADD SP,8        ! 12
    SUB CX,AX       ! 13
    PUSH    CX      ! 14
    PUSH    _EXIT       ! 15
    SYS         ! 16
.SECT .DATA         ! 17
hw:             ! 18
.ASCII  "Hello World\n"     ! 19
de: .BYTE   0       ! 20
.SECT .BSS
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
16.02.2014, 20:09
Ответы с готовыми решениями:

Как сделать вывод в цикле один раз?
Код проверяет является ли массив симметричным относительно главной диагонали. Проблема у меня с...

Вывод "Hello, world!" заданое количество раз, с новой строки
Доброго времени суток. Помогите написать програму на асме,сам впервые стыкаюсь с ним.. Сама...

Рекурсия: вывод "Hello, World!" N раз
Напишите, пожалуйста, код, который выводит "Hello, World!" N раз. Не могу понять, как пользоваться...

Hello world, смена цвета символов в цикле
Всем доброго времени суток господа. Начинающий (зеленый) программист ищет помощи в надежде что ему...

5
Эксперт быдлокодинга
2083 / 517 / 68
Регистрация: 04.11.2010
Сообщений: 1,293
16.02.2014, 20:51 2
Лучший ответ Сообщение было отмечено DmitryM5 как решение

Решение

Наверное вот так
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
! Simple "hello world" program
! See section 9.8.1.
 
    _EXIT   = 1     !  1
    _WRITE  = 4     !  2
    _STDOUT = 1     !  3
.SECT .TEXT         !  4
      MOV CX, 10 ; до цикла счётчик зарядил правильно
start:              !  5
push cx ; только его нужно сныкать в стек потому что дальше будет
    MOV CX,de-hw    !  6 ; хуерга которая перебивала твой счётчик
    PUSH    CX      !  7
    PUSH    hw      !  8
    PUSH    _STDOUT     !  9
    PUSH    _WRITE      ! 10
    SYS         ! 11
pop cx ; а тут мы извлекаем счётчик из стека, а не минусуем ту хуергу что косорезит сразу после старта
        LOOP start 
    ADD SP,8        ! 12
    SUB CX,AX       ! 13
    PUSH    CX      ! 14
    PUSH    _EXIT       ! 15
    SYS         ! 16
.SECT .DATA         ! 17
hw:             ! 18
.ASCII  "Hello World\n"     ! 19
de: .BYTE   0       ! 20
.SECT .BSS
3
Maria ->∞
106 / 86 / 44
Регистрация: 27.08.2013
Сообщений: 1,277
Записей в блоге: 1
17.02.2014, 18:49  [ТС] 3
Не работает,происходит зацикливание...Virtual Box,Lubunty,assembler 8088
Вот мой код:
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
! Simple "hello world" program
 
! See section 9.8.1.
 
 
 
    _EXIT   = 1     !  1
 
    _WRITE  = 4     !  2
 
    _STDOUT = 1     !  3
 
.SECT .TEXT         !  4
 
    MOV CX, 10
 
start:  
 
    push cx;        !  5
 
    MOV CX,de-hw    !  6
 
    PUSH    CX      !  7
 
    PUSH    hw      !  8
 
    PUSH    _STDOUT     !  9
 
    PUSH    _WRITE      ! 10
 
    SYS         ! 11
 
    pop cx;
 
    LOOP start
 
    ADD SP,8        ! 12
 
    SUB CX,AX       ! 13
 
    PUSH    CX      ! 14
 
    PUSH    _EXIT       ! 15
 
    SYS         ! 16
 
.SECT .DATA         ! 17
 
hw:             ! 18
 
.ASCII  "Hello World\n"     ! 19
 
de: .BYTE   0       ! 20
 
.SECT .BSS
0
Эксперт быдлокодинга
2083 / 517 / 68
Регистрация: 04.11.2010
Сообщений: 1,293
17.02.2014, 19:11 4
DmitryM5,
Цитата Сообщение от DmitryM5 Посмотреть сообщение
Не работает,происходит зацикливание...Virtual Box,Lubunty,assembler 8088
Сказать по правде с Lubunty я знаком чуть хуже чем с дзета-функцией Римана, но могу предположить что SYS это функция. и вполне допускаю, что она не парится выравнивать после себя стек и счётчик уходит на дно. В качестве угадайки могу предложить запихнуть
Assembler
1
ADD SP,8        ! 12
в петлю и зазырить что получится. Уж больно эта ADD равнялку стека напоминает.
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
! Simple "hello world" program
! See section 9.8.1.
 
    _EXIT   = 1     !  1
    _WRITE  = 4     !  2
    _STDOUT = 1     !  3
.SECT .TEXT         !  4
      MOV CX, 10 ; до цикла счётчик зарядил правильно
start:              !  5
push cx ; только его нужно сныкать в стек потому что дальше будет
    MOV CX,de-hw    !  6 ; хуерга которая перебивала твой счётчик
    PUSH    CX      !  7
    PUSH    hw      !  8
    PUSH    _STDOUT     !  9
    PUSH    _WRITE      ! 10
    SYS         ! 11
  ADD SP,8        ! 12 ; мне видится что это компенсация четырёх PUSH перед SYS
pop cx ; а тут мы извлекаем счётчик из стека, а не минусуем ту хуергу что косорезит сразу после старта
        LOOP start 
 ;    ADD SP,8        ! 12
    SUB CX,AX       ! 13
    PUSH    CX      ! 14
    PUSH    _EXIT       ! 15
    SYS         ! 16
.SECT .DATA         ! 17
hw:             ! 18
.ASCII  "Hello World\n"     ! 19
de: .BYTE   0       ! 20
.SECT .BSS
Повторюсь, это только мои догадки.
1
Клюг
7664 / 3179 / 382
Регистрация: 03.05.2011
Сообщений: 8,381
17.02.2014, 19:31 5
Цитата Сообщение от DmitryM5 Посмотреть сообщение
Не работает,происходит зацикливание...
Зато вот это работает:
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
;fasm helbsd
;ld -s -o helbsd helbsd.o
include 'BSD/macros.inc'
include 'BSD/syscall.inc'
STDOUT  = 1
format ELF
 
section '.text' executable
public _start
_start: mov cx, 10
@@: push    cx
    syscall SYS_WRITE,STDOUT, msg, msg_size
    pop cx
    loop    @B
    syscall SYS_EXIT, 0
 
section '.data' writeable
msg db 'Hello, FreeBSD world!',0xD,0xA
msg_size = $-msg
Цитата Сообщение от DmitryM5 Посмотреть сообщение
Virtual Box,Lubunty,assembler 8088
Fasm, FreeBSD 7.3, штатный линкер ld.
Ну и https://www.cyberforum.ru/post5449843.html
1
Maria ->∞
106 / 86 / 44
Регистрация: 27.08.2013
Сообщений: 1,277
Записей в блоге: 1
17.02.2014, 19:38  [ТС] 6
Цитата Сообщение от Полный 30h Посмотреть сообщение
DmitryM5,
Сказать по правде с Lubunty я знаком чуть хуже чем с дзета-функцией Римана, но могу предположить что SYS это функция. и вполне допускаю, что она не парится выравнивать после себя стек и счётчик уходит на дно. В качестве угадайки могу предложить запихнуть
Assembler
1
ADD SP,8        ! 12
в петлю и зазырить что получится. Уж больно эта ADD равнялку стека напоминает.
Работает,спасибо!
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
17.02.2014, 19:38

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Команды в цикле выполняются на один раз больше положенного числа раз
Есть следующий скрипт: rem Данный батник производит преобразование имен телефонный аудиозаписей...

hello world 10 раз
нужен вывести hello world 10 раз через for и while.как это сделать я не знаю. printf 10 раз не...

Напечатать слово world n раз
привет ребят) нужна очень помощь)) если не трудно напишите решение задач вот этих: 1) Напечатать...

Нужно вывести на экран “Hello world” N раз
Нужно вывести на экран “Hello world” N раз. Input Со стандартного устройства ввода вводится 1...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.