Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Центр помощи > распечатка цифр от 10 до 100, как реализовать


Автор: americanets 30.10.2008, 17:18
как реализовать такую вещь, на с++ например это у меня выглядит так , а как на ассемблере сделать , компилятор 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

Автор: Rodman 30.10.2008, 19:53

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

Автор: Mikl_ 31.10.2008, 04:48
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

Автор: americanets 31.10.2008, 09:52
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

Автор: Mikl_ 31.10.2008, 11:10
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


Автор: americanets 31.10.2008, 11:39
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 например и обработать как ошибку если не числа

Автор: Mikl_ 1.11.2008, 04:03
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 

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

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)