Форум программистов, компьютерный форум, киберфорум
Наши страницы
Assembler: математика, вычисления
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.88/8: Рейтинг темы: голосов - 8, средняя оценка - 4.88
NewMax
2 / 2 / 0
Регистрация: 12.05.2009
Сообщений: 9
1

Base64 (nasm)

02.05.2010, 01:10. Просмотров 1419. Ответов 2
Метки нет (Все метки)

Приветствую сообщество форума. Обращаюсь с проблемой небольшой. Мне нужно было реализовать программу, кодирующую файл (или введенную строку) в формате Base64. Помучив себя и гугл, написал программу, которая даже работает, но немного некорректно... Собственно прошу помочь разобраться в паре моментов:
- при перекодировке лишние байты не заменяются символом '=' (например, при вводе 1 должно получиться MQ==, а получается MQoA). Хочу понять, почему так и как это решить;
- как узнать длину выходной строки?
Собственно привожу код программы (на nasm). Надеюсь на вашу помощь, заранее спасибо.
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
SECTION .data 
Print:      DB 'Введите строку, которую нужно закодировать: ',10 
PrintLen:   EQU $-Print 
Rezult:     DB 'Результат кодировки записан в файл, созданный в директории с программой ',10 
RezultLen:  EQU $-Rezult 
MsgCr:      DB 'Введите имя файла, в который будет записана закодированная срока: ',10 
MsgLen:     EQU $-MsgCr
ErrorCreate:    DB 'Ошибка! Файл не создан! Программа будет закрыта!',10 
ErrorCreateLen: EQU $-ErrorCreate
chr_table:  DB 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/',10
 
SECTION .bss
string:     RESB 1023
outBuff:    RESW 1023
FileName:   RESB 255
    %macro write 2          ;Макрос, реализующий системный вызов для записи
        mov eax,    4
        mov ebx,    1
        mov ecx,    %1
        mov edx,    %2
        int 80h
    %endmacro
    %macro read 2           ;Макрос, реализующий системный вызов для чтения
        mov eax,    3
        mov ebx,    0
        mov ecx,    %1
        mov edx,    %2
        int 80h
    %endmacro
SECTION .text
    GLOBAL _start
_start:
        write Print, PrintLen
        read    string, 255
        push    eax
;-----------------Кодировка-------------------------------------------
        pop ecx
        mov esi,    string
        mov edi,    chr_table
        push    ebp
        mov ebp,    outBuff
src_byteLoop:
        XOR eax,    eax
        ;считываем 3 байта
 
        mov ah, BYTE[esi]
        mov al, BYTE[esi+1]
        shl eax,    16
        mov ah, BYTE[esi+2]
        mov edx,    eax
        shl eax,    6   
        
        shr edx,    26
        mov bl, BYTE[edi+edx] 
        mov BYTE[ebp],bl
        inc ebp 
        mov edx,    eax
        shl eax,    6   
        
        shr edx,    26
        mov bl, BYTE[edi+edx]
        mov BYTE[ebp],bl
        inc ebp
        mov edx,    eax
        shl eax,    6
        
        shr edx,    26
        mov bl, BYTE[edi+edx]
        mov BYTE[ebp],  bl
        inc ebp
        mov edx,    eax
        shl eax,    6
    
        shr edx,    26
        mov bl, BYTE[edi+edx]
        mov BYTE[ebp],bl
        inc ebp
 
        add esi,    3
        sub ecx,    3
        cmp ecx,    3
        jge src_byteLoop
 
        XOR eax,    eax
        
        cmp ecx,    0
        je  finish
        
        mov ah, BYTE[esi]
        mov al, BYTE[esi+1]
        shl eax,    16
        mov ah, BYTE[esi+2]
 
        sub ecx,    3
        neg ecx
        mov edx,    ecx
 
        mov esi,    255
        lea     ecx,    [ecx*8+8]
        shl     esi,    cl
        and     eax,    esi
 
        mov     ecx,    edx 
                
        mov     edx,    eax
        shl     eax,    6                        
 
        shr     edx,    26
        mov     bl,     BYTE[edi+edx]
        mov     BYTE[ebp], bl
        inc     ebp 
                    
        mov     edx,    eax
        shl     eax,    6                        
 
        shr     edx,    26
        mov     bl,     BYTE[edi+edx]
        mov     BYTE[ebp], bl
        inc     ebp
        
            
        mov     edx,    eax
        shl     eax,    6                        
                        
        shr     edx,    26
        mov     bl,     BYTE[edi+edx]
        mov     BYTE[ebp], bl
        inc     ebp
        
        mov     edx,    eax
        shl     eax,    6                        
 
        shr     edx,    26
        mov     bl,     BYTE[edi+edx]
        mov     BYTE[ebp], bl
        inc     ebp
 
        mov eax,    ecx
finish:
        test    eax,    eax
        jz  end
        sub ebp,    eax
padChars:
        mov BYTE[ebp],0x3D
        inc ebp
        dec eax
        cmp eax,    0
        jnz padChars
end:
        pop ebp
;-------------------Конец-кодировки-----------------------------------------
        ;write  MsgCr,  MsgLen
        XOR esi,    esi
;создаем файл, в который сохраним результат
        read    FileName, 100 
    
        mov esi,    FileName
        add esi,    eax
        dec esi
        mov BYTE[esi], 0
        push    esi     
 
        mov eax,    8
        mov ebx,    FileName
        mov ecx,    00400
        pop edx 
        int 80h
;файл создан (гипотетически) в директории с программой
        cmp     eax,    -1
        je  ErrorFileCreate     
        push    eax
;запись строки в файл
        write   Rezult, RezultLen
        mov eax,    4
        pop ebx
        mov ecx,    outBuff
        mov edx,    4
        int 80h
;закрытие файла
        mov eax,    6
        mov ebx,    [FileName]
        int 80h 
        
        jmp ExitProgramm
;ошибка при создании файла
        ErrorFileCreate:
        write   ErrorCreate, ErrorCreateLen
        
        ExitProgramm:       
        write outBuff, 4
        
        mov     eax,    1
        mov     ebx,    0
        int     80h
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
02.05.2010, 01:10
Ответы с готовыми решениями:

[nasm] Метод Гаусса
Добрый день! Для курсовой работы задали метод гаусса на NASM. Нужна бы нормальная литература, а то...

BASE64: кодировка и декодировка
Доброе время суток, Тут завалялось задача по асму кодировка BASE64. Вообщем, нужно написать...

Компиляция при помощи NASM
Я только-только начинающий, почитал некоторое количество материала по ассемблеру, очень захотелось...

NASM: Нахождение максимального элемента в матрице
нужно найти максимального элемента в матрице (4х4) на насме и в линуксе на форуме находил...

[NASM] Реализовать алгоритм, заданный на языке C
здравствуйте ю можете помочь перевести с С зыка на ассамблер . intel процессор #include <stdio.h>...

2
NewMax
2 / 2 / 0
Регистрация: 12.05.2009
Сообщений: 9
11.05.2010, 16:19  [ТС] 2
Ну что же, вроде что-то сделал: программа запускается с двумя аргументами (файл, который нужно перекодировать и файл, в который будет записан результат). Как и все сущее, она несовершенна, работает только с малым количеством информации, да и проблемы с кодированием могут возникать... но раскодирование показывает, что все хорошо Вот, привожу код, может, кому пригодится:
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
SECTION .data 
ErrorCreate:    DB 'Ошибка создания файла-приемника! Программа будет закрыта!',10 
ErrorCreateLen: EQU $-ErrorCreate
ErrFile:        DB  'Ошибка открытия файла источника! Программа будет закрыта!',10
ErrLen:         EQU $-ErrFile
ErrEnter:       DB 'Ошибка при запуске программы! Запуск должен быть вида "./programm inputfile outputfile"! Программа будет закрыта!',10
ErrEnterLen:    EQU $-ErrEnter
chr_table:      DB 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/',10
 
SECTION .bss
string:     RESB 1023
outBuff:    RESW 4096
FileName:   RESB 255
FileName2:  RESB 255
P:          RESB 255
    %macro  write 2         ;Макрос, реализующий системный вызов для записи
        mov     eax,    4
        mov     ebx,    1
        mov     ecx,    %1
        mov     edx,    %2
        int     80h
    %endmacro
    %macro read 2           ;Макрос, реализующий системный вызов для чтения
        mov     eax,    3
        mov     ebx,    0
        mov     ecx,    %1
        mov     edx,    %2
        int     80h
    %endmacro
SECTION .text
    GLOBAL _start
_start:
;Достаем из командной строки аргументы
        pop     eax
        cmp     eax,    2
        je      op3
        cmp     eax,    3
        jne     op1
        pop     ebx
        pop     ebx
        pop     edi
        push    ebx
;Открываем входной файл
        mov     eax, 5
        pop     ebx
        mov     ecx, 0
        pop     edx
        int     80h
        mov     [P], eax
        cmp     eax, -1
        je      op
    
op1:
;Получаем содержимое файла
        mov     eax,    3
        mov     ebx,    [P]
        mov     ecx,    string
        mov     edx,    255
        int     80h
        push    eax
;-----------------Кодировка-------------------------------------------
        pop     ecx
        mov     esi,    string
        push    edi
        mov     edi,    chr_table
        mov     ebp,    outBuff
src_byteLoop:
        XOR     eax,    eax
;Считываем 3 байта
        mov     ah, BYTE[esi]
        mov     al, BYTE[esi+1]
        shl     eax,    16
        mov     ah, BYTE[esi+2]
;Сдвигаем полученные байты
        mov     edx,    eax
        shl     eax,    6   
        shr     edx,    26
        mov     bl, BYTE[edi+edx] ;Помещаем полученный символ в выходной буфер
        mov     BYTE[ebp],bl
        inc     ebp
 
        mov     edx,    eax
        shl     eax,    6
        shr     edx,    26
        mov     bl, BYTE[edi+edx]
        mov     BYTE[ebp],bl
        inc     ebp
        
        mov     edx,    eax
        shl     eax,    6
        shr     edx,    26
        mov     bl, BYTE[edi+edx]
        mov     BYTE[ebp],  bl
        inc     ebp
 
        mov     edx,    eax
        shl     eax,    6
        shr     edx,    26
        mov     bl, BYTE[edi+edx]
        mov     BYTE[ebp],bl
        inc     ebp
;Смотрим, осталось ли во входной строке что-нибудь
        add     esi,    3
        sub     ecx,    3
        cmp     ecx,    3
        jge     src_byteLoop
 
        XOR     eax,    eax
;Если входная строка пуста, уходим
        cmp     ecx,    0
        jz      finish
        
        mov     ah, BYTE[esi]
        mov     al, BYTE[esi+1]
        shl     eax,    16
        mov     ah, BYTE[esi+2]
 
        sub     ecx,    3
        neg     ecx
        mov     edx,    ecx
 
        mov     esi,    255
        lea     ecx,    [ecx*8+8];получаем эффективный адрес (смещение)
        shl     esi,    cl
        and     eax,    esi
        mov     ecx,    edx         
        
        mov     edx,    eax
        shl     eax,    6                        
        shr     edx,    26
        mov     bl,     BYTE[edi+edx]
        mov     BYTE[ebp], bl
        inc     ebp 
                    
        mov     edx,    eax
        shl     eax,    6                        
        shr     edx,    26
        mov     bl,     BYTE[edi+edx]
        mov     BYTE[ebp], bl
        inc     ebp
                  
        mov     edx,    eax
        shl     eax,    6                                       
        shr     edx,    26
        mov     bl,     BYTE[edi+edx]
        mov     BYTE[ebp], bl
        inc     ebp
        
        mov     edx,    eax
        shl     eax,    6                        
        shr     edx,    26
        mov     bl,     BYTE[edi+edx]
        mov     BYTE[ebp], bl
        inc     ebp
 
        mov eax,    ecx
finish:
;Проверяем, а не хватит ли нам кодированием заниматься
        test    eax,    eax
        jz      end
        sub     ebp,    eax
padChars:
;Вставляем символы "=" вместо недостающих
        mov     BYTE[ebp],0x3D
        inc     ebp
        dec     eax
        cmp     eax,    0
        jnz     padChars
end:
;Находим длину выходного буфера
        mov     edi, 0
        mov     ecx, 0
strlenloop: 
        mov     cl, [outBuff+edi]
        inc     edi
        jcxz    exitloop
        jmp     strlenloop
exitloop:
;-------------------Конец-кодировки-----------------------------------------
        XOR     esi,    esi
;создаем файл, в который сохраним результат
        mov     eax,    8
        pop     ebx
        mov     ecx,    00400
        pop     edx 
        int     80h
;файл создан (гипотетически)
        cmp     eax,    -1
        je      ErrorFileCreate     
        push    eax
;запись выходного буфера в файл
        mov     eax,    4
        pop     ebx
        mov     ecx,    outBuff
        mov     edx,    edi
        int     80h
;закрытие файла
        mov     eax,    6
        mov     ebx,    [FileName2]
        int     80h 
        jmp     ExitProgramm
;ошибка при создании файла
        ErrorFileCreate:
        write   ErrorCreate, ErrorCreateLen
        
        ExitProgramm:       
        write outBuff, edi
        read    outBuff, 3 ; импровизированная пауза, чтобы пользователь успел увидеть результат
 
        mov     eax,    1
        mov     ebx,    0
        int     80h
;А тут есть всякие сообщения об ошибках
op:
        write   ErrFile, ErrLen
        jmp ExitProgramm
op3:
        write   ErrEnter, ErrEnterLen
        jmp ExitProgramm
1
Дударь_Кира
0 / 0 / 0
Регистрация: 25.05.2010
Сообщений: 4
25.05.2010, 21:12 3
если можешь, глянь тему мою, пожалуйста. помощь нужна очень (
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.05.2010, 21:12

Генерация фрактала Мандельброта. NASM + OpenGL
Всем здравия! Помогите мне, нужна помощь опытных людей. Замучился совсем. Вроде делаю всё как надо,...

Битовые операции, система уравнений (nasm)
Как решить такую задачу, помогите пожалуйста. На вход программе подаются числа a11, a12, a21,...

[NASM] Реализовать алгоритм, заданный на языке C
Помогите пожалуйста переписать небольшой код С в NASM. #include <stdio.h> main() { ...


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

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

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