Форум программистов, компьютерный форум, киберфорум
Наши страницы
Assembler, MASM, TASM
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.89/9: Рейтинг темы: голосов - 9, средняя оценка - 4.89
ChinYan
2 / 2 / 0
Регистрация: 23.09.2010
Сообщений: 47
1

Передача структуры в процедуру

19.01.2012, 22:48. Просмотров 1749. Ответов 13
Метки нет (Все метки)

Нужно передать в процедуру структуру. Для упражнения взял пародию на MessageBox
Вот структура

Assembler
1
2
3
4
5
6
MESG STRUC
    hWnd DD ?
    MESS DD ?
    TITL DD ?
    FLAG DD ?
MESG ENDS
Вот ее инициализация:

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
.586P
.MODEL FLAT, stdcall
;------------------------------------------
includelib C:\masm32\lib\kernel32.lib
includelib C:\masm32\lib\user32.lib
 
;------------------------------------------
EXTERN ShowMessage@16:NEAR
EXTERN ExitProcess@4:NEAR
include st.inc
 
 
_DATA SEGMENT
MSGTTL DB 'Message',0
MSGTXT DB 'Hello World!',0
 MSG   MESG <?>
_DATA ENDS
;----------------------------------------
_TEXT SEGMENT
START:
 
MOV MSG.hWnd,0
MOV MSG.FLAG,0
 
MOV [MSG.TITL], OFFSET MSGTTL
MOV [MSG.MESS], OFFSET MSGTXT
 
PUSH MSG
 
 
CALL ShowMessage@16
    
PUSH 0
CALL ExitProcess@4
 
_TEXT ENDS
END START

Вот функция ShowMessage:
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
.586P
.MODEL FLAT, stdcall
;---------------------------------------------
 
includelib c:\masm32\lib\user32.lib
 
EXTERN MessageBoxA@16:NEAR
include st.inc
;---------------------------------------------
 
PUBLIC ShowMessage
 
_TEXT SEGMENT
 
ShowMessage PROC hMes: MESG
 
    PUSH hMes.FLAG
    PUSH hMes.TITL
    PUSH hMes.MESS
    PUSH hMes.hWnd
    
    call MessageBoxA@16
    
     
    RET 
ShowMessage ENDP
 
_TEXT ENDS
END
Если верить отладчику, то она инициализируется и моя функция нормально вызывается, но MessageBox'у передается мусор вместо параметров и она не вызывается. Вот как провернуть такое? Идея передавать все члены записи поштучно не рассматривается в данном случае
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
19.01.2012, 22:48
Ответы с готовыми решениями:

Передача параметров в процедуру
Доброго времени суток. Нужна ваша помощь, знатоки! Возникла нужда в изучении процедур и передачи в...

Передача параметров в процедуру
Пока не нашел функцию ltoa, пытался добавить подсчет количества записанных байтов. Добавил параметр...

Передача значений в процедуру
Задание: Необходимо оформить подпрограмму удаления лишних пробелов в строке (лишними считаются...

Передача массива в процедуру
Добрый день. Помогите пожалуйста разобраться с передачей массива в процедуру через регистр. В...

Передача через стек параметры в процедуру
Пытаюсь реализовать первое действие. Точнее проверить его. Реализовать в процедуре действие...

13
asm
62 / 35 / 3
Регистрация: 05.10.2011
Сообщений: 137
19.01.2012, 23:51 2
можно файлы с батником?
0
Vadimych
635 / 478 / 12
Регистрация: 10.01.2011
Сообщений: 1,047
20.01.2012, 07:31 3
ChinYan, попробуйте передать в процедуру указатель на структуру.
0
Mikl___
Автор FAQ
13484 / 6415 / 635
Регистрация: 11.11.2010
Сообщений: 11,588
20.01.2012, 12:47 4
ChinYan,
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
.586
.MODEL FLAT
EXTERN _imp__MessageBoxA@16:dword
includelib \masm32\lib\user32.lib 
;-----------------------------------------
MESG STRUC
        hWnd DD ?
        MESS DD ?
        TITL DD ?
        FLAG DD ?
MESG ENDS
.code;Сегмент кода.
start:  sub esp,sizeof MESG;освободим место под структуру в стеке
    mov edi,esp
    mov esi,offset mesg
    mov ecx,(sizeof MESG)/4
    rep movsd
    CALL _imp__MessageBoxA@16
    ret
.data;Сегмент данных.
align 4;важно! структура перед передачей в стек должна быть выровнена по адресу кратному 4
mesg MESG <0,offset MSG,offset TIT,0>; заполненная структура
TIT     DB 'Title',0
MSG     DB 'Hello World!',0 
end start
0
20.01.2012, 12:47
ChinYan
2 / 2 / 0
Регистрация: 23.09.2010
Сообщений: 47
20.01.2012, 13:26  [ТС] 5
Mikl___, выводит вот это:
main.asm(22) : error A2179: structure improperly initialized
main.asm(22) : error A2008: syntax error : in structure
main.asm(25) : warning A4023: with /coff switch, leading underscore required for start address : start
0
Mikl___
Автор FAQ
13484 / 6415 / 635
Регистрация: 11.11.2010
Сообщений: 11,588
20.01.2012, 13:27 6
ChinYan, tasm, masm? попробуй поменять местами секцию данных с секцией кода
0
ChinYan
2 / 2 / 0
Регистрация: 23.09.2010
Сообщений: 47
20.01.2012, 13:37  [ТС] 7
masm32 менял, не помогает
0
Mikl___
Автор FAQ
13484 / 6415 / 635
Регистрация: 11.11.2010
Сообщений: 11,588
20.01.2012, 13:41 8
содержимое файла 02a.asm
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
.586
.MODEL FLAT, stdcall
option casemap:none
EXTERN _imp__MessageBoxA@16:dword
includelib \masm32\lib\user32.lib 
;-----------------------------------------
MESG STRUC
        hWnd DD ?
        MESS DD ?
        TITL DD ?
        FLAG DD ?
MESG ENDS
.code;Сегмент кода.
start:  sub esp,sizeof MESG;освободим место под структуру в стеке
        mov edi,esp
        mov esi,offset mesg
        mov ecx,(sizeof MESG)/4
        rep movsd
        CALL _imp__MessageBoxA@16
        ret
.data;Сегмент данных.
align 4;важно! структура перед передачей в стек должна быть выровнена по адресу кратному 4
mesg MESG <0,offset MSG,offset TIT,0>; заполненная структура
TIT     DB 'Title',0
MSG     DB 'Hello World!',0 
end start
содержимое файла 1.bat
ActionScript 3
1
2
\masm32\bin\ml /c /coff "02a.asm"
\masm32\bin\Link /SUBSYSTEM:WINDOWS "02a.obj"
компиляция и линковка без ошибок
0
Vadimych
635 / 478 / 12
Регистрация: 10.01.2011
Сообщений: 1,047
20.01.2012, 13:45 9
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
.586P
.MODEL FLAT, stdcall
 
;------------------------------------------
includelib \masm32\lib\kernel32.lib
includelib \masm32\lib\user32.lib
 
include \masm32\include\kernel32.inc
include \masm32\include\user32.inc 
 
;------------------------------------------
MESG STRUCT
        hWnd DD ?
        MESS DD ?
        TITL DD ?
        FLAG DD ?
MESG ENDS
 
_DATA SEGMENT
MSGTTL DB 'Message',0
MSGTXT DB 'Hello World!',0
 MSG   MESG <>
_DATA ENDS
;----------------------------------------
_TEXT SEGMENT
START:
 
MOV MSG.hWnd,0
MOV MSG.FLAG,0
 
MOV MSG.TITL, OFFSET MSGTTL
MOV MSG.MESS, OFFSET MSGTXT
 
PUSH offset MSG
call ShowMessage
 
ret 
 
ShowMessage PROC hMes: dword
mov ebx,hMes
assume ebx:ptr MESG
        PUSH [ebx].FLAG
        PUSH [ebx].TITL
        PUSH [ebx].MESS
        PUSH [ebx].hWnd
        
        call MessageBox
        
         
        RET 
ShowMessage ENDP
_TEXT ends
end START
3
ChinYan
2 / 2 / 0
Регистрация: 23.09.2010
Сообщений: 47
20.01.2012, 13:49  [ТС] 10
Ураааа Vadimych, заработало
0
Mikl___
Автор FAQ
13484 / 6415 / 635
Регистрация: 11.11.2010
Сообщений: 11,588
20.01.2012, 13:53 11
Vadimych, мой дзен круче
ChinYan, добейся чтобы и мой вариант зароботал
0
ChinYan
2 / 2 / 0
Регистрация: 23.09.2010
Сообщений: 47
20.01.2012, 13:58  [ТС] 12
Заработал, как ни странно. полностью скопировал ваш код и батник.
Но, не в обиду будет сказано, код Vadimych мне более понятен
0
Mikl___
Автор FAQ
13484 / 6415 / 635
Регистрация: 11.11.2010
Сообщений: 11,588
20.01.2012, 14:04 13
ChinYan,
Есть многое на свете, друг Горацио, что и не снилось нашим мудрецам
(В.Шекспир "Гамлет", д. 1, сц. 5)
0
Vadimych
635 / 478 / 12
Регистрация: 10.01.2011
Сообщений: 1,047
20.01.2012, 14:05 14
Цитата Сообщение от Mikl___ Посмотреть сообщение
Vadimych, мой дзен круче
Mikl___, спору нет.
1
20.01.2012, 14:05
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.01.2012, 14:05

Передача параметров из Си в процедуру в Ассемблере
Здравствуйте, пожалуйста подскажите... никак не могу разобраться с передачей параметров из Си в...

Передача нескольких параметров в pthread_create (передача структуры)
Здравствуйте. Мне нужно передать последним параметром в функцию pthread_create следующую структуру...

Передача структуры из программы на c# в dll на c++ и получение структуры из dll
В общем проблема в том, что при попытке передачи структуры созданной в c# в dll на c++ происходит...


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

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

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