Модераторы: Poseidon
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> распечатка цифр от 10 до 100, как реализовать 
V
    Опции темы
americanets
Дата 30.10.2008, 17:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1100
Регистрация: 27.9.2006

Репутация: нет
Всего: 12



как реализовать такую вещь, на с++ например это у меня выглядит так , а как на ассемблере сделать , компилятор nasm (linux x 64)


Код

#include <iostream>
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
    int start = atoi( argv[1] );
    int stop = atoi( argv[2] );
    for (int i = start; i<= stop; i++) {
        std::cout << "Выводим : " << i << std::endl;
    }
    return 0;
}


Код

./line 22 24
Выводим : 22
Выводим : 23
Выводим : 24



в ассеблере не разбираюсь а вот код такой очень нужен 

например под nasm хело ворд такой


Код

global _start
_start:
mov eax, 4
mov ebx, 1
mov ecx, msg
mov edx, msglen
int 0x80
mov eax, 1
mov ebx, 0
int 0x80
section .data
msg: db "Hello word",0x0A,0
msglen equ $-msg



--------------------
Пусть популярную музыку слушают те, среди кого она популярна
PM   Вверх
Rodman
Дата 30.10.2008, 19:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


CIO
****


Профиль
Группа: Участник
Сообщений: 6144
Регистрация: 7.5.2006
Где: Ukraine ⇛ Kyiv ci ty

Репутация: 26
Всего: 122




M
Rodman
Модератор: Название темы должно содержать язык написания!

PM MAIL WWW Skype GTalk YIM MSN   Вверх
Mikl_
Дата 31.10.2008, 04:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 537
Регистрация: 9.11.2007

Репутация: нет
Всего: 14



americanets, никогда не писал под linux, но наверное твоя задача решается так
Код
global _start
_start: mov ecx,90; цикл выполняется 90 раз (100-10)
a1:     push ecx
         mov eax,100
         sub eax,ecx; eax:=100-ecx причем ecx уменьшается от 90 до 0
         aam; ax/10 в ah частное в al остаток
         or ax,3030h; превращаем число в ASCII-символы
         mov [msg],ax
         mov eax, 4;выводим строку на экран
         mov ebx, 1
         mov ecx, msg
         mov edx, 3
         int 0x80
         pop ecx
         loop a1; в начало цикла
         mov eax, 1; завершаем программу
         mov ebx, 0
         int 0x80
section .data
msg: db 0,0,0x0A


Это сообщение отредактировал(а) Mikl_ - 31.10.2008, 06:12
PM MAIL   Вверх
americanets
Дата 31.10.2008, 09:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1100
Регистрация: 27.9.2006

Репутация: нет
Всего: 12



Rodman, да, извиняюсь


Mikl_, не поддерживается в 64


Код

test.asm:3: error: instruction not supported in 64-bit mode
test.asm:6: error: instruction not supported in 64-bit mode
test.asm:14: error: instruction not supported in 64-bit mode




Код

a1:     push ecx
         aam; ax/10 в ah частное в al остаток
         pop ecx



--------------------
Пусть популярную музыку слушают те, среди кого она популярна
PM   Вверх
Mikl_
Дата 31.10.2008, 11:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 537
Регистрация: 9.11.2007

Репутация: нет
Всего: 14



americanets, я же написал, что в linux не программировал -- соответственно, компилятора под линух у меня нет и увидеть ошибки (про 64-разряда не было сказано ни слова) я не могу. Знаю точно, что инструкция aam в 64-разрядах не поддерживается. На что еще ссылается компилятор? (на какие строки листинга?) Понял - на push ecx и pop ecx Вообще-то пуш/поп в 64-разрядах должен поддерживаться -- напиши push rcx/pop rcx
Код

global _start
_start: mov ecx,90; цикл выполняется 90 раз (100-10)
a1:     push rcx
         mov eax,100
         sub eax,ecx; eax:=100-ecx причем ecx уменьшается от 90 до 0
         mov cl,10
         div cl; ax/10 в ah частное в al остаток
         xchg al,ah ; если числа выводятся наоборот типа "01,11,21,..." тогда убери эту строку
         or ax,3030h; превращаем число в ASCII-символы
         mov [msg],ax
         mov eax, 4;выводим строку на экран
         mov ebx, 1
         mov ecx, msg
         mov edx, 3
         int 0x80
         pop rcx
         loop a1; в начало цикла
         mov eax, 1; завершаем программу
         mov ebx, 0
         int 0x80
section .data
msg: db 0,0,0x0A



Это сообщение отредактировал(а) Mikl_ - 31.10.2008, 11:34
PM MAIL   Вверх
americanets
Дата 31.10.2008, 11:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1100
Регистрация: 27.9.2006

Репутация: нет
Всего: 12



Mikl_, 

огромное спасибо то что надо


Код

~/CPP/asm$ nasm -f elf64 test.asm -o test.o
~/CPP/asm$ ld test.o -o test
~/CPP/asm$ ./test 
01
11
21
31
41
51
61
71
81
91
02
12
22
32
42
52
62
72
82
92
03
13
23
33
43
53
63
73
83
93
04
14
24
34
44
54
64
74
84
94
05
15
25
35
45
55
65
75
85
95
06
16
26
36
46
56
66
76
86
96
07
17
27
37
47
57
67
77
87
97
08
18
28
38
48
58
68
78
88
98
09
19
29
39
49
59
69
79
89
99



Добавлено через 9 минут и 52 секунды
а как быть с вводом счисел через командную строку ?

test 10 100 например и обработать как ошибку если не числа


--------------------
Пусть популярную музыку слушают те, среди кого она популярна
PM   Вверх
Mikl_
Дата 1.11.2008, 04:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 537
Регистрация: 9.11.2007

Репутация: нет
Всего: 14



americanets, я уже третий раз повторяю -- я не программирую на linux и, соответственно, не знаю как обрабатывается на linux командная строка, кстати, обрати внимание, что у тебя цифры "вывернуты на изнанку" -- посмотри в листинге -- я предлагал в этом случае убрать строку xchg ah,al <-- 8 строка  smile 
Q: Как мне получить аргументы командной строки и переменные окружения? 
A: В точке входа в программу (_start:) в стеке содержатся следующие данные: 
dword [esp] - n, количество аргументов командной строки 
dword [esp+4] - адрес первого аргумента, имя программы 
dword [esp+4*2] - адрес второго аргумента 
... 
dword [esp+4*n] - адрес последнено аргумента 
dword [esp+4*n+4] - нулевой адрес (NULL) 
dword [esp+4*n+8] - адрес переменных окружения
Q: Какие порекомендуете ссылки? 
A:GNU Binutils (англ) - http://www.gnu.org/software/binutils 
NASM (рус) - http://www.opennet.ru/docs/RUS/nasm/ 
GNU AS(рус) - http://www.opennet.ru/docs/RUS/gas 
FASM (рус) - http://mythrillus.land.ru/tajga-tut/index.html 
Форум WASM.UNIX (рус) на http://wasm.ru/forum 
Справочник man (рус, англ) http://man.opennet.ru 
Архитектура операционной системы UNIX (пер. с THE DESIGN OF THE UNIX OPERATING SYSTEM by Maurice J. Bach) 
Читай значения в командной строке "test MIN MAX" переводишь MIN и MAX из строковой в числовую форму и подставишь сюда
Код
mov ecx,MAX-MIN
a1:     push rcx
         mov eax,MAX
всего-то и делов  smile 

Это сообщение отредактировал(а) Mikl_ - 1.11.2008, 05:08
PM MAIL   Вверх
americanets
Дата 1.11.2008, 09:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1100
Регистрация: 27.9.2006

Репутация: нет
Всего: 12



Mikl_, спасибо , про цифры прочитал, закоментировал нормально работает, спасибо за ссылки и объяснение 


--------------------
Пусть популярную музыку слушают те, среди кого она популярна
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Центр помощи"

ВНИМАНИЕ! Прежде чем создавать темы, или писать сообщения в данный раздел, ознакомьтесь, пожалуйста, с Правилами форума и конкретно этого раздела.
Несоблюдение правил может повлечь за собой самые строгие меры от закрытия/удаления темы до бана пользователя!


  • Название темы должно отражать её суть! (Не следует добавлять туда слова "помогите", "срочно" и т.п.)
  • При создании темы, первым делом в квадратных скобках укажите область, из которой исходит вопрос (язык, дисциплина, диплом). Пример: [C++].
  • В названии темы не нужно указывать происхождение задачи (например "школьная задача", "задача из учебника" и т.п.), не нужно указывать ее сложность ("простая задача", "легкий вопрос" и т.п.). Все это можно писать в тексте самой задачи.
  • Если Вы ошиблись при вводе названия темы, отправьте письмо любому из модераторов раздела (через личные сообщения или report).
  • Для подсветки кода пользуйтесь тегами [code][/code] (выделяйте код и нажимаете на кнопку "Код"). Не забывайте выбирать при этом соответствующий язык.
  • Помните: один топик - один вопрос!
  • В данном разделе запрещено поднимать темы, т.е. при отсутствии ответов на Ваш вопрос добавлять новые ответы к теме, тем самым поднимая тему на верх списка.
  • Если вы хотите, чтобы вашу проблему решили при помощи определенного алгоритма, то не забудьте описать его!
  • Если вопрос решён, то воспользуйтесь ссылкой "Пометить как решённый", которая находится под кнопками создания темы или специальным флажком при ответе.

Более подробно с правилами данного раздела Вы можете ознакомится в этой теме.

Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Poseidon, Rodman

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Центр помощи | Следующая тема »


 




[ Время генерации скрипта: 0.0500 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.