Форум программистов, компьютерный форум, киберфорум
Assembler для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.50/18: Рейтинг темы: голосов - 18, средняя оценка - 4.50
Пробующий
185 / 98 / 10
Регистрация: 28.04.2009
Сообщений: 1,101
1

Прочесть вещественную матрицу из файла

02.01.2010, 02:58. Показов 3273. Ответов 37
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Задача прочесть матрицу из файла и просуммировать элементы каждой строки, а потом вывести в результирующий файл. Я никак не могу прочесть вещественные элементы.
Для ДОСа можно так как тут https://www.cyberforum.ru/asse... 74003.html
А вот здесь я непойму как найти
1) точку, чтобы разделить целую часть и дробную
2) пробел, табуляцию, перенос строки.
Матрица в файле записана по строкам через пробел.
1.67 -4.56 7.89 0.23
5.67 ...
Фактически вот программа, она открывает файл и помещает в память
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
.386
.model flat, stdcall
option casemap:none
include \MASM32\INCLUDE\windows.inc
include \MASM32\INCLUDE\kernel32.inc
include \MASM32\INCLUDE\user32.inc
includelib \MASM32\LIB\kernel32.lib
includelib \MASM32\LIB\user32.lib
 
.data
fName db "input.txt"
hFile DWORD ?
buf WORD 1024 dup(?)
HeadHeap DWORD ?
pointer DWORD ?
FileSize DWORD ?
fN db "output.txt"
 
.code
start:
invoke CreateFile, ADDR fName, GENERIC_READ,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0
mov hFile, eax
invoke GetFileSize, hFile, 0
mov FileSize , eax
call GetProcessHeap
mov HeadHeap, eax
invoke HeapAlloc, HeadHeap, 0, FileSize 
mov pointer, eax
invoke ReadFile, hFile, pointer, FileSize ,offset FileSize , NULL
mov eax, pointer
После чего я для наглядности вывожу это на экран
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
add eax, FileSize
mov ecx, FileSize
m1:
sub eax, 2
sub ecx, 2
mov bx, [eax]
mov buf[ecx], bx
cmp ecx, 0
jg m1
 
invoke CloseHandle, hFile
invoke CreateFile, ADDR fN, GENERIC_WRITE,0,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_ARCHIVE,0
    mov hFile, eax
invoke WriteFile, hFile, ADDR buf, FileSize, offset FileSize, NULL
invoke CloseHandle, hFile
invoke ExitProcess, 0
End start
Принимаются любые советы. Может в литературе где кто видел.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
02.01.2010, 02:58
Ответы с готовыми решениями:

Определить вещественную динамическую матрицу
Помогите пожалуйста(СИ) Определить вещественную динамическую матрицу. Для динамического...

Построить вещественную матрицу по образцу
Помогите пожалуйста!!!! Как для заданного значения n (константа) построить вещественную матрицу X...

Построить вещественную матрицу A (10,10) по правилу
Кто-нибудь может найти ошибку в данном коде: Option Explicit Option Base 1 Sub Выполнить()...

Сформировать вещественную матрицу 5х5
Сформировать вещественную матрицу 5х5. Вычислить произведение отрицательных элементов, находящихся...

37
2537 / 833 / 10
Регистрация: 31.05.2009
Сообщений: 1,668
03.01.2010, 04:01 21
Author24 — интернет-сервис помощи студентам
Или вообще не заводить эти массивы а сразу делать все что нужно с числом и сохранять его.
1
Пробующий
185 / 98 / 10
Регистрация: 28.04.2009
Сообщений: 1,101
03.01.2010, 04:10  [ТС] 22
Хорошо. Вернемся к посту номер 12. Как же все таки это сделать?

Не по теме:

Я могу и сам допереть, но я с сопроцессором почти не работал. Мне нужно будет потратить на это день. Поэтому и решился спросить)



Добавлено через 5 минут
Assembler
1
2
3
4
5
6
7
8
mov eax, 2317318476d
mov ebx, 100000d
push eax
fild [esp]
push ebx
fidiv [esp]
pop ebx
pop eax;тут будет дробное число?
0
2537 / 833 / 10
Регистрация: 31.05.2009
Сообщений: 1,668
03.01.2010, 04:18 23
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
    xor edx,edx ; здесь будет собираться наше число
    xor ebx,ebx ; тут делитель
    xor edi,edi ; флаг отрицательного числа
    mov esi,offset chislo ; строка с числом
    
l1:
    lodsb ; в al - очередной символ 
    cmp al,20h ; если это пробел, значит число закончилось
    jz del
    
    cmp al,'.'
    jz l2
    
    cmp al,'-'
    jz l3
    
    lea edx,[edx+edx*4] ; умножаем на 10
    lea ebx,[ebx+ebx*4]
    sub eax,'0'
    shl edx,1
    shl ebx,1 ; если в ebx - 0, то он там и останется, если нет, то умножится.
    add edx,eax ; добавляем число
    jmp l1
    
l2:
    inc ebx; теперь тут будет 1
    jmp l1
    
l3:
    dec edi ; взведем флаг
    jmp l1
del:
; делим и выгружаем куда нужно
    test edi,edi
    jz @f
        neg edx
@@:
    push edx
    fild dword ptr [esp]
    push ebx
    fidiv dword ptr  [esp]
    pop ebx
    pop edx
    fstp [mass]
...
Собственно это я написал только что, поэтому может есть ошибки.
1
Пробующий
185 / 98 / 10
Регистрация: 28.04.2009
Сообщений: 1,101
03.01.2010, 04:31  [ТС] 24
Цитата Сообщение от Goodwin98 Посмотреть сообщение
lea edx,[edx+edx*4] ; умножаем на 10
lea ebx,[ebx+ebx*4]
Массив для чисел 1, 10, 100 все таки будет, так что это дело ускорится
Спасибо. Выручили. Один только остался вопрос: Можно выгружать так?
Assembler
1
2
3
4
5
6
.data
mass DWORD 1024 dup(0)
.code
lea eax, mass
add eax, 8 ; это указатель на 3 элемент массива
fstp [eax]
0
2537 / 833 / 10
Регистрация: 31.05.2009
Сообщений: 1,668
03.01.2010, 04:37 25
да можно, но можно и так.
Assembler
1
2
mov eax,3
fstp [mass+eax*4]
1
Пробующий
185 / 98 / 10
Регистрация: 28.04.2009
Сообщений: 1,101
03.01.2010, 04:46  [ТС] 26
Цитата Сообщение от Goodwin98 Посмотреть сообщение
mass+eax*4
мне тут не нравится умножение. Если компилятор догадается сделать его сдвигом - то хорошо, а если нет - опять потери производительности. Мне ценен каждый такт
Вот еще была идея распараллелить вычисления, но так как у нас компы в универе одноядерные, то выход вижу такой:
Одновременно вычислять на сопроцессоре, с помощью mmx, и еще задействовать графический процессор (он, скажем, хорошо приучен вічислять склярніе пр-я, так как єто надо для графики, и ему можно затолкать наборі вещественніх чисел, а он их перемножит). Как Вы думаете, стоит ли связываться? И это же будет нужна многопоточность?

Добавлено через 3 минуты
допустим первое моё задание - перемножить 2 матрицы большие. Тут у меня алгоритм, который блоками их перемножает, т. е. я могу разбить её на блоки, и скармливать одновременно ЦП(пусть читает следующее из файла), сопроцессору, ммх, и видеокарте. А потом все это собрать воедино уже, скажим, сопроцессором. Так можно?
0
2537 / 833 / 10
Регистрация: 31.05.2009
Сообщений: 1,668
03.01.2010, 04:50 27
Цитата Сообщение от galileopro Посмотреть сообщение
мне тут не нравится умножение. Если компилятор догадается сделать его сдвигом - то хорошо, а если нет - опять потери производительности.
Это не компилятора команда, а у процессора такой вид аддресации есть. Ес-но он сдвигом делать будет.

C CUDA (а именно так называется технология пользования в/картой nVidia для вычисления) я ниразу не сталкивался, но мне почему-то кажется, что из асма это будет очень немалый геморой делать.
А mmx может работать только с целыми числами и деления у него нету. К тому же mmx и FPU пользуют одни и те же регистры, поэтому нельзя их использовать одновременно.

Можно было бы попробовать на SSE командах сделать, но я опять же не имею возможности с ними экспериментировать.
1
Пробующий
185 / 98 / 10
Регистрация: 28.04.2009
Сообщений: 1,101
03.01.2010, 04:57  [ТС] 28
Цитата Сообщение от Goodwin98 Посмотреть сообщение
C CUDA (а именно так называется технология пользования в/картой nVidia для вычисления) я ниразу не сталкивался, но мне почему-то кажется, что из асма это будет очень немалый геморой делать.
А mmx может работать только с целыми числами и деления у него нету. К тому же mmx и FPU пользуют одни и те же регистры, поэтому нельзя их использовать одновременно.
Можно было бы попробовать на SSE командах сделать, но я опять же не имею возможности с ними экспериментировать.
Спасибо. Ну уж не знаю, получиться ли у меня с видеокартой поработать, но в принципе это реально. И причем прирост наблюдается немалый. Скажем даже у старенькой 6600 процессор вроде был 300Mh А многопоточность из масма с помощью вин АПИ реально заюзать? создать новый поток вроде мне удавалось, вот поместить туда вычисления - нет.
0
2537 / 833 / 10
Регистрация: 31.05.2009
Сообщений: 1,668
03.01.2010, 05:01 29
Если время терпит вот тут человек что-то рассказывал про свой алгоритм вычисления матриц. Я особо не вчитывался что там, но может полезно.

Добавлено через 2 минуты
Цитата Сообщение от galileopro Посмотреть сообщение
А многопоточность из масма с помощью вин АПИ реально заюзать? создать новый поток вроде мне удавалось, вот поместить туда вычисления - нет.
А почему бы нет, только вот будет ли от этого прирост производительности на одноядерной машине, это совсем другой вопрос
1
Пробующий
185 / 98 / 10
Регистрация: 28.04.2009
Сообщений: 1,101
03.01.2010, 05:11  [ТС] 30
Спасибо. Насчет прироста - это кот в мешке. Ну на С++ я делал - прирост был. Там надо экспериментировать. Причем если слишком много потоков - тоже плохо.
Кстати, насчте того, что Вам хватает 192 метра ОЗУ. Вот даже в этой задаче мне чтобы эффективно считать файл, и потом без проблем работать с этой матрице нужно 10^5*10^5*4=4*10^10 байт или 4 гига памяти. Поэтому я буду хранить матрицу по частям. У меня как раз 4 гига ОЗУ, но моя 32 битная хрюша их всех не видит. Щас интенсивно юзают 64 битную Висту скажем.
0
2537 / 833 / 10
Регистрация: 31.05.2009
Сообщений: 1,668
03.01.2010, 05:18 31
Скажем так я вообще не понимаю практический смысл таких матриц. Единственное, что мне в голову приходит - это 3d графика, но с ними вроде как видеокарта должна работать, а не програмист.

Добавлено через 3 минуты
Цитата Сообщение от galileopro Посмотреть сообщение
У меня как раз 4 гига ОЗУ, но моя 32 битная хрюша их всех не видит.
Ну это проблема винды, а не процессора. Он-то как раз на 4 (с некоторые материнками и на 6) гигов расчитан. Писал кто-то из наших форумчан даже статейку на эту тему...
1
Пробующий
185 / 98 / 10
Регистрация: 28.04.2009
Сообщений: 1,101
03.01.2010, 18:09  [ТС] 32
Цитата Сообщение от Goodwin98 Посмотреть сообщение
Скажем так я вообще не понимаю практический смысл таких матриц. Единственное, что мне в голову приходит - это 3d графика, но с ними вроде как видеокарта должна работать, а не програмист.
Ну это применятся в математической статичтике, для анализа систем, там для обработки статистических данных требуется найти решение или хотя бы псевдорешение большой системы. Ну 100000 это предел, обычно системы получаются на пару тысяч входов. Но даже для системы 4000 x 4000 для хорошей точности нужно 256 метров памяти. Что уже не мало. Ну там есть методы хранения хорошие, вообщем это все философия. Я думаю сделать прогу, чтобы она максимум тянула 10000 х 10000 матрицы. И хватит
1
Пробующий
185 / 98 / 10
Регистрация: 28.04.2009
Сообщений: 1,101
03.01.2010, 23:52  [ТС] 33
Реализовал я чтение, но что-то оно читает одни нули. Кстати выводит в фай оно правильно. Если в eax засунуть какое-нибудь число, то в файл оно его запишет. Выложу код и исходники, может кто заметит ошибку. Я пока не нашел. Даже с отладчиком.
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
.386
.model flat, stdcall
option casemap:none
include \MASM32\INCLUDE\windows.inc
include \MASM32\INCLUDE\kernel32.inc
include \MASM32\INCLUDE\user32.inc
includelib \MASM32\LIB\kernel32.lib
includelib \MASM32\LIB\user32.lib
 
.data
fName db "input.txt"
hFile DWORD ?
mass DWORD 64 dup(0)
buf BYTE 256 dup(20h)
ten DWORD 20 dup(1)  ;массив из степеней десяти
HeadHeap DWORD ?
pointer DWORD ?
FileSize DWORD ?
fOut db "output.txt"
cWrite DWORD ?
flag db 0 
 
.code
start:
invoke CreateFile, ADDR fName, GENERIC_READ,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0
    mov hFile, eax
invoke GetFileSize, hFile, 0
    mov FileSize , eax
call GetProcessHeap
    mov HeadHeap, eax
invoke HeapAlloc, HeadHeap, 0, FileSize 
    mov pointer, eax
invoke ReadFile, hFile, pointer, FileSize ,offset FileSize , NULL
    mov ebx, pointer
    mov esi, ebx
    add esi, FileSize
    
 mov eax, 1 ;сформируем массив "ten"
    xor ecx, ecx
notexit:
    mov ten[ecx], eax
    lea eax, [eax+eax*4]
    add ecx, 4
    cmp ecx, 80
        jl notexit
            
xor ecx, ecx ;счетчик цифр после запятой
xor eax, eax ;используем этот регистр для накопления числа
xor edi, edi ;номер считываемого числа
 
begin:
mov dl, [ebx] ; читаем символ из кучи
    inc ebx
 
cmp ebx, esi
    jz exitasm 
    
cmp dl,'.'
    jz real
    
cmp dl,'-'
    jz otr
    
cmp dl, 20h ; если пробел - то число считано
    jz exitasm
    jnz begin
    
cmp ecx, 0
    jz notreal
    inc ecx ;накапливаем количество цифр после запятой, если они есть
    
notreal:
    lea eax,[eax+eax*4] ; умножаем на 10 наше число (сдвигаем десятичный разряд)
    and dl, 00001111b ; преобразуем считанный символ в число (вычесть 48)
    add eax, edx ; прибавляем новую цифру к нашему числу
        jmp begin ;отправляемся за новой цифрой
 
real:
    inc ecx ; это число содержит дробную часть
        jmp begin
        
otr:
    mov flag, 10 ; это отрицательное число
        jmp begin
 
exitasm:  ;мы полностью накопили одно из чисел. Засунем его в массив mass    
    cmp flag, 0 ;если 0 - положительное
        jz pozitiv 
        neg eax
        mov flag, 0 ;обнулим флаг, так как не знаем знак следующего числа
        
pozitiv:
    cmp ecx, 0 ;если 0 - целое
        jz integer
        mov ecx, ten[ecx]
        push eax
        fild dword ptr [esp]
        push ecx
        fidiv dword ptr [esp]
        pop eax
        pop ecx
        fstp [mass+edi*4] ; мы засунули действительное
        
integer:
       mov [mass+edi*4], eax ; мы засунули целое
       
    inc edi ;переходим к следующем элементу mass
    xor ecx, ecx
    cmp ebx, esi ;проверим, не закончился ли файл
    jl begin 
 
invoke CloseHandle, hFile ;файл можно закрывать    
;просуммируем все элементы массива mass и запишем полученное число в файл 
 
    xor eax, eax ; обнулим накопитель
    mov ecx, edi ;сколько чисел суммируем
notsumm:
    add eax, [mass+ecx*4]
        loop notsumm
    
;начинаем записывать сумму в файл. (Тут можно засунуть в eax другое чило, чтобы вывести.)
 
    mov ebx, 10
    xor ecx, ecx
    
cmp eax, 0
    jg positiv
    mov flag, 10
    neg eax
    
positiv:
    xor edx, edx
    div ebx
    push edx
    inc ecx
    test eax, eax
    jnz positiv
 
mov edi, ecx ;количество цифр до запятой. Пока выведу целую часть.
    xor ecx, ecx
 
cmp flag, 10
    jnz notwriteminus
    mov buf[ecx], '-'
    inc ecx
    inc edi
    
notwriteminus:
    pop edx
    xor dl, 00110000b ;цифра в символ ASCII.
    mov buf[ecx], dl
    inc ecx
    cmp ecx, edi
    jl notwriteminus
    
invoke CreateFile, ADDR fOut, GENERIC_WRITE,0,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,0
    mov hFile, eax
invoke WriteFile, hFile, ADDR buf, edi, offset cWrite, NULL
invoke CloseHandle, hFile
invoke ExitProcess, 0
End start
1.rar
0
Пробующий
185 / 98 / 10
Регистрация: 28.04.2009
Сообщений: 1,101
04.01.2010, 01:57  [ТС] 34
Goodwin98, а как мне к целому привести его? Ну вот скажем у меня в
Assembler
1
mass DWORD 64 dup(20)
вещественные числа. Как мне их просуммировать, и вывести целую часть от суммы?

Вот я доделал код, он успешно помещает в массив и целые и вещественные числа, но когда у меня в массиве часть целых часть вещественных, то после суммирования получается бред.
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
.386
.model flat, stdcall
option casemap:none
include \MASM32\INCLUDE\windows.inc
include \MASM32\INCLUDE\kernel32.inc
include \MASM32\INCLUDE\user32.inc
includelib \MASM32\LIB\kernel32.lib
includelib \MASM32\LIB\user32.lib
 
.data
fName db "input.txt"
hFile DWORD ?
mass DWORD 64 dup(20)
buf BYTE 256 dup(20h)
ten DWORD 20 dup(1)  ;массив из степеней десяти
HeadHeap DWORD ?
pointer DWORD ?
FileSize DWORD ?
fOut db "output.txt"
cWrite DWORD 0
flag db 0 
 
.code
start:
invoke CreateFile, ADDR fName, GENERIC_READ,0,NULL,OPEN_ALWAYS,FILE_ATTRIBUTE_NORMAL,0
    mov hFile, eax
invoke GetFileSize, hFile, 0
    mov FileSize , eax
call GetProcessHeap
    mov HeadHeap, eax
invoke HeapAlloc, HeadHeap, 0, FileSize 
    mov pointer, eax
invoke ReadFile, hFile, pointer, FileSize ,offset FileSize , NULL
    mov ebx, pointer 
       
 mov eax, 1 ;сформируем массив "ten"
    xor ecx, ecx
notexit:
    mov ten[ecx], eax
    lea eax, [eax+eax*4]
    add ecx, 4
    cmp ecx, 80
        jl notexit
        
 
    mov esi, ebx
    add esi, FileSize            
xor ecx, ecx ;счетчик цифр после запятой
xor eax, eax ;используем этот регистр для накопления числа
xor edi, edi ;номер считываемого числа
xor edx, edx
 
begin:
mov dl, [ebx] ; читаем символ из кучи
    inc ebx
    
cmp dl,'.'
    jz real
    
cmp dl,'-'
    jz otr
    
cmp dl, 20h ; если пробел - то число считано
    jz exitasm
    
cmp ecx, 0
    jz notreal
    inc ecx ;накапливаем количество цифр после запятой, если они есть
    
notreal:
    and dl, 00001111b ; преобразуем считанный символ в число (вычесть 48)
    lea eax,[eax+eax*4] ; умножаем на 10 наше число (сдвигаем десятичный разряд)
    shl eax, 1
    add eax, edx ; прибавляем новую цифру к нашему числу
        jmp begin ;отправляемся за новой цифрой
 
otr:
    mov flag, 10 ; это отрицательное число
        jmp begin 
        
real:
    inc ecx ; это число содержит дробную часть
        jmp begin
 
exitasm:  ;мы полностью накопили одно из чисел. Засунем его в массив mass    
    cmp flag, 0 ;если 0 - положительное
        jz pozitiv 
        neg eax
        mov flag, 0 ;обнулим флаг, так как не знаем знак следующего числа
        
pozitiv:
    cmp ecx, 0 ;если 0 - целое
        jz integer
        mov ecx, ten[ecx]
        push eax
        fild dword ptr [esp]
        push ecx
        fidiv dword ptr [esp]
        pop eax
        pop ecx
        fstp [mass+edi*4] ; мы засунули действительное
        
integer:
    mov [mass+edi*4], eax ; мы засунули целое
       
    inc edi ;переходим к следующем элементу mass
    xor ecx, ecx
    xor eax, eax
    cmp ebx, esi
    jl begin
 
invoke CloseHandle, hFile ;файл можно закрывать    
;просуммируем все элементы массива mass и запишем полученное число в файл 
;сколько чисел суммируем хранится в edi
 
    xor eax, eax ; обнулим накопитель 
    xor ecx, ecx
notsumm:
    add eax, [mass+ecx*4]
    inc ecx
    cmp ecx, edi
    jl notsumm
 
;начинаем записывать сумму в файл
 
    mov ebx, 10
    xor ecx, ecx
    
cmp eax, 0
    jnl positiv
    mov flag, 10
    neg eax
    
positiv:
    xor edx, edx
    div ebx
    push edx
    inc ecx
    test eax, eax
    jnz positiv
 
mov edi, ecx ;количество цифр до запятой. Пока выведу целую часть.
    xor ecx, ecx
 
cmp flag, 10
    jnz notwriteminus
    mov buf[ecx], '-'
    inc ecx
    inc edi
    
notwriteminus:
    pop edx
    xor dl, 00110000b ;цифра в символ ASCII.
    mov buf[ecx], dl
    inc ecx
    cmp ecx, edi
    jl notwriteminus
    
invoke CreateFile, ADDR fOut, GENERIC_WRITE,0,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,0
    mov hFile, eax
invoke WriteFile, hFile, ADDR buf, edi, offset cWrite, NULL
invoke CloseHandle, hFile
invoke ExitProcess, 0
End start
1.rar
Переформулирую вопрос: как просуммировать элементы вещественного массива и затем поместить в eax целую часть этой суммы?
Как поместить в массив вещественных чисел целое число? Т. е. как из 345345 сделать 345345.000...
0
2537 / 833 / 10
Регистрация: 31.05.2009
Сообщений: 1,668
04.01.2010, 02:08 35
А зачем в одном массиве смешивать разные типы чисел ? Если после точки идут только нули, то это означает, что просто делить не надо и все.
Команда FPU для сложения - fadd, а после сложения сохранить куда нужно округленное число можно просто fistp
1
Пробующий
185 / 98 / 10
Регистрация: 28.04.2009
Сообщений: 1,101
04.01.2010, 02:13  [ТС] 36
Цитата Сообщение от Goodwin98 Посмотреть сообщение
А зачем в одном массиве смешивать разные типы чисел ? Если после точки идут только нули, то это означает, что просто делить не надо и все.
Т. е.
Assembler
1
mov [mass+edi*4], eax ; мы засунули целое
заменить на
Assembler
1
2
    push eax
    fstp [mass+edi*4] ; мы засунули целое
?
0
2537 / 833 / 10
Регистрация: 31.05.2009
Сообщений: 1,668
04.01.2010, 02:15 37
да...
1
Пробующий
185 / 98 / 10
Регистрация: 28.04.2009
Сообщений: 1,101
04.01.2010, 02:48  [ТС] 38
А суммировать так?
Assembler
1
2
3
4
5
6
7
8
9
10
11
xor eax, eax ; îáíóëèì íàêîïèòåëü 
    push eax
    xor ecx, ecx
notsumm:
    fadd [mass+ecx*4]
    inc ecx
    cmp ecx, edi
    jl notsumm
    
    fistp [mass]
    mov eax, [mass]
Добавлено через 28 минут
Оно не суммирует. В результате в eax получается 47996544
0
04.01.2010, 02:48
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
04.01.2010, 02:48
Помогаю со студенческими работами здесь

Квадратную вещественную матрицу А раз
В задаче предусмотреть динамический захват памяти, решение оформить в виде отдельной функции....

Заменить целочисленную матрицу на вещественную
Доброе время суток, есть программа с генерацией и выводом ЦЕЛОЧИСЛЕННОЙ матрицы с диапазоном чисел...

Получить вещественную квадратную матрицу порядка n

Получить вещественную квадратную матрицу порядка n
Дан одномерный массив х1, х2, ..., xn–1, xn. Получить вещественную квадратную матрицу порядка n:


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

Или воспользуйтесь поиском по форуму:
38
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru