Форум программистов, компьютерный форум, киберфорум
Наши страницы
Assembler для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
Doublench
1 / 1 / 0
Регистрация: 05.07.2013
Сообщений: 176
1

Как считать число из stdin для дальнейшего использования

10.06.2014, 12:14. Просмотров 838. Ответов 7
Метки нет (Все метки)

Использую NASM под OCUNIX
0
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.06.2014, 12:14
Ответы с готовыми решениями:

Stdin, для чего делается данное вычитание в коде
Интересует данный фрагмент в файле stdin.asm Допустим мой буфер -...

Как считать массив из RichTextBox для его дальнейшего использования?
Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As...

Как сделать комплексное число глобальным, для дальнейшего использования?
Мне нужно чтобы а1, а2, а3 можно было использовать дальше, return a1,a2,a3;...

Как распознавать данные в String для дальнейшего использования?
Решил написать программу, которая будет решать, заранее заданные пользователем,...

Временное хранилище для дальнейшего использования данных
Здравствуйте! Я только начинаю изучать C#.Net. У меня есть маленькая...

7
Charles Kludge
Клюг
7646 / 3161 / 383
Регистрация: 03.05.2011
Сообщений: 8,382
10.06.2014, 13:44 2
Цитата Сообщение от Doublench Посмотреть сообщение
Использую NASM
Не это поделие я больше не подписываюсь, увольте.
А для FASM/FreeBSD это выглядит так:
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
; fasm example of using the C library in Unix systems
 
; compile the source with commands like:
;   fasm getnum.asm getnum.o
;   gcc getnum.o -o getnum
;   strip getnum
 
format ELF
 
include 'ccall.inc'
 
section '.text' executable
 
 public main
 extrn printf
 extrn scanf
 extrn puts
 
 main:
    ccall   puts, req
    ccall   scanf, tptd, num
    ccall   printf, msg, [num], [num]
    ret
 
section '.data' writeable
num dd  1234
msg db  "Got %d. / %lx",0xA,0
tptd    db  '%d',0
req db  'Enter number:',0
И ccall.inc к нему:
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
macro ccall proc,[arg]
  { common
     local size
     size = 0
     mov ebp,esp
     if ~ arg eq
    forward
     size = size + 4
    common
     sub esp,size
     end if
     and esp,-16
     if ~ arg eq
     add esp,size
    reverse
     pushd arg
    common
     end if
     call proc
     mov esp,ebp }
0
Doublench
1 / 1 / 0
Регистрация: 05.07.2013
Сообщений: 176
10.06.2014, 19:29  [ТС] 3
Charles Kludge, А можно вопрос, как сделать линковку вместе с библиотекой Си glibc ?
0
Charles Kludge
Клюг
7646 / 3161 / 383
Регистрация: 03.05.2011
Сообщений: 8,382
10.06.2014, 20:18 4
Doublench, мне её ещё построить надо.
0
Doublench
1 / 1 / 0
Регистрация: 05.07.2013
Сообщений: 176
10.06.2014, 20:31  [ТС] 5
Charles Kludge, У меня просто нет gcc. Я не знаю как включить эту библиотеку без него.
0
Charles Kludge
Клюг
7646 / 3161 / 383
Регистрация: 03.05.2011
Сообщений: 8,382
10.06.2014, 20:47 6
Эмм... в общем случае ld -l LIBNAME или ld --library LIBNAME , LIBNAME - путь до либы вместе с именем. А gcc же из портов построить можно, потом всё равно пригодится.
0
Doublench
1 / 1 / 0
Регистрация: 05.07.2013
Сообщений: 176
10.06.2014, 20:53  [ТС] 7
Charles Kludge, помогите пожалуйста. У меня сейчас нет возможности это сделать на Unix, есть только Windows в данный момент. Так вот, не могу скомпоновать следующий код.
Кликните здесь для просмотра всего текста
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
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
%define SUCCESS 0 ; возвращаемое значение функции в случаи успеха
%define MIN_MAX_NUMBER 2 ; мин.ввод.число
%define MAX_MAX_NUMBER 4294967294 ; 2^32 макс.ввод. число
 
global _start ; делаем глобальной точку старта программы
 
;определение функции из библиотеки Си
extern _printf  
extern _scanf
extern _malloc
extern _free
 
;определение доп.функций
     
     ; ФУНКЦИИ
; Результат записывается в EAX, статус - в EDX.
; В случае успеха EDX содержит значение SUCCESS (0),
; инчае - адрес сообщения об ошибке.
;
;
 
; Ввести максимальное число
; Результат: EAX - максимальное число
input_max_number:   
    ;создать стек-фрейм,
    ;4 байта для локальных переменных
    enter 4, 1
 
    ;показываем подпись
    push str_max_number_label ;см. SECTION .data
    call _printf
    add esp, 4
 
    ;вызываем scanf
    mov eax, ebp
    sub eax, 4
    
    push eax
    push str_max_number_input_format ;см. SECTION .data
    call _scanf
    add esp, 8
    
    mov eax, [ebp-4]
 
    ;проверка
    cmp eax, MIN_MAX_NUMBER
    jb .number_too_little
    cmp eax, MAX_MAX_NUMBER
    ja .number_too_big
    jmp .success
 
    ;выход
    .number_too_little:
        mov edx, str_error_max_num_too_little ;см. SECTION .data
        jmp .return 
        
    .number_too_big:
        mov edx, str_error_max_num_too_big ;см. SECTION .data
        jmp .return 
 
    .success:
        push eax
        push str_max_number_output_format ;см. SECTION .data
        call _printf
        add esp, 4
        pop eax
        mov edx, SUCCESS
    
    .return:
        leave
        ret
 
 
; Выделить память для массива флагов
; Аргумент: EAX - максимальное число
; Результат: EAX - указатель на память
allocate_flags_memory:
    enter 8, 1
 
    ;выделить EAX+1 байт
    inc eax
    mov [ebp-4], eax
    
    push eax
    call _malloc
    add esp, 4
    
    ;проверка
    cmp eax, 0
    je .fail
    mov [ebp-8], eax
    
    ;инициализация
    mov byte [eax], 0
    
    cld
    mov edi, eax
    inc edi
    mov edx, [ebp-4]
    add edx, eax
    
    mov al, 1
    .write_true:
        stosb
        cmp edi, edx
        jb .write_true
    
    ;выход
    mov eax, [ebp-8]
    jmp .success
    
    .fail:
        mov edx, str_error_malloc_failed ;см. string_constants.asm
        jmp .return
    
    .success:
        mov edx, SUCCESS
            
    .return:
        leave
        ret
 
; Освободить память от массива флагов
; Аргумент: EAX - указатель на память
free_flags_memory:
    enter 0, 1
    
    push eax
    call _free
    add esp, 4
    
    leave
    ret
    
    
;Найти простые числа с помощью решета Эратосфена
;Аргументы: EAX - указатель на массив флагов, EBX - максимальное число  
find_primes_with_eratosthenes_sieve:
    enter 8, 1
    mov [ebp-4], eax
        
    add eax, ebx
    inc eax
    mov [ebp-8], eax
    
    ;вычеркиваем составные числа
    cld
    mov edx, 2 ;p = 2
    mov ecx, 2 ;множитель с = 2
    .strike_out_cycle:
        ;x = c*p
        mov eax, edx
        push edx
        mul ecx
        pop edx
        
        cmp eax, ebx
        jbe .strike_out_number
        jmp .increase_p
        
        .strike_out_number:
            mov edi, [ebp-4]
            add edi, eax
            mov byte [edi], 0
            inc ecx ;c = c + 1
            jmp .strike_out_cycle
            
        .increase_p:
            mov esi, [ebp-4]
            add esi, edx
            inc esi
            
            mov ecx, edx
            inc ecx
            .check_current_number:
                mov eax, ecx
                mul eax
                cmp eax, ebx
                ja .return
            
                lodsb
                inc ecx
                cmp al, 0
                jne .new_p_found
                jmp .check_current_number
            
                .new_p_found:
                    mov edx, ecx
                    dec edx
                    mov ecx, 2
                    jmp .strike_out_cycle           
    
    .return:
        leave
        ret
        
 
; Вывести простые числа
; Параметры: EAX - указатель на массив флагов, EBX - максимальное число
print_primes:
    enter 12, 1
    mov [ebp-4], eax
    mov [ebp-8], ebx
    
    push str_print_primes_label
    call _printf
    add esp, 4
    
    cld
    mov esi, [ebp-4]
    mov edx, esi
    add edx, [ebp-8]
    inc edx
    
    mov [ebp-12], edx
    mov ecx, 0
    .print_cycle:
        lodsb
        cmp al, 0
        jne .print
        jmp .check_finish
        .print:
            push esi
            push ecx
            push str_prime ;см. string_constants.asm
            call _printf
            add esp, 4
            pop ecx
            pop esi
            mov edx, [ebp-12]
        .check_finish:
            inc ecx
            cmp esi, edx
            jb .print_cycle
            
    push str_cr_lf
    call _printf
    add esp, 4
            
    leave
    ret
 ;;
    
;;НАЧАЛО ОСНОВНОГО КОДА 
    
SECTION .text
_start: ; точка старта программы
    enter 0, 0 ; 
    
    ;ввод максимального числа
    call input_max_number ; функция в случаи успеха кладет в edx 0, а результат кладет в eax
    cmp edx, SUCCESS ; сравниваем
    jne .custom_exit 
    mov [max_number], eax
    
    ;выделяем память для массива флагов
    mov eax, [max_number]
    call allocate_flags_memory
    cmp edx, SUCCESS
    jne .custom_exit
    mov [primes_pointer], eax
    
    ;отсеять составные числа
    mov eax, [primes_pointer]
    mov ebx, [max_number]
    call find_primes_with_eratosthenes_sieve
    
    ;вывести числа
    mov eax, [primes_pointer]
    mov ebx, [max_number]
    call print_primes
    
    ;освободить память от массива флагов
    mov eax, [primes_pointer]
    call free_flags_memory
    
   ;выход
    .success:
        push str_exit_success
        call _printf
        jmp .return
            
    .custom_exit:
        push edx
        call _printf
        
    .return:
        mov eax, SUCCESS
        leave
        ret
        
SECTION .data
    max_number: dd 0
    primes_pointer: dd 0
    
    ;определение строковых переменных
    
    ;подписи ввода-вывода, форматы
str_max_number_label: db "Input number: ", 0
str_max_number_input_format: db "%u", 0
str_max_number_output_format: db "Using number %u", 0xD, 0xA, 0
 
str_print_primes_label: db "Primes:", 0xD, 0xA, 0
str_prime: db "%u", 0x9, 0
str_cr_lf: db 0xD, 0xA, 0
    
;сообщения выхода
str_exit_success: db "Success!", 0xD, 0xA, 0
str_error_max_num_too_little: db "Max number is too little!", 0xD, 0xA, 0
str_error_max_num_too_big: db "Max number is too big!", 0xD, 0xA, 0
str_error_malloc_failed: db "Can't allocate memory!", 0xD, 0xA, 0

Используется библиотека Си для вызова printf, scanf, malloc.
0
Charles Kludge
Клюг
7646 / 3161 / 383
Регистрация: 03.05.2011
Сообщений: 8,382
10.06.2014, 21:18 8
Лучший ответ Сообщение было отмечено Doublench как решение

Решение

Всё в аттаче, под фряшей работает. Ком. строка такая:
nasm -f elf -o double.o double.asm
gcc -o double double.o

Исходник немного поправил, пара строк комментов начинаются с ;KL+.
1
Вложения
Тип файла: zip double.zip (6.6 Кб, 4 просмотров)
10.06.2014, 21:18
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.06.2014, 21:18

Очистить значение переменной для дальнейшего использования
#include <iostream> #include <conio.h> using namespace std; int main() {...

Передача пераметров объекта для дальнейшего использования
Здравствуйте! Пытаюсь написать простенький код на С++ с использованием классов....

Сохранить отрисованный объект в ОЗУ для дальнейшего использования
Рисую в окне график. Есть функция которая вычисляет и выводит его размер и...


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

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

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