Форум программистов, компьютерный форум, киберфорум
Assembler, MASM, TASM
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.92/25: Рейтинг темы: голосов - 25, средняя оценка - 4.92
 Аватар для Dimarik__
21 / 21 / 3
Регистрация: 29.04.2010
Сообщений: 444

FAQ (указатели и сегменты)

30.06.2011, 19:45. Показов 5167. Ответов 26
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Может быть это и часто задаваемые вопросы, но объясните, пожалуйста, несколько важных ключевых моментов:
1. Вот есть функция DeleteFileW, в МСДН написано что она принимает const char* то есть LPCTSTR.
Объявляю переменную:
в сегменте кода
DB_fileAdress DD ?;адрес файла
когда я пишу:
Assembler
1
2
push offset DB_fileAdress
    call DeleteFileW
то у меня почему-то не работает! А когда без offset то работает! Хотя ведь по идее offset - это типа указатель? Ведь так?
2. Объясните, пожалуйста, зачем нужны эти сегменты. Потом что один автор пишет что нужно писать _TEXT segment - это типа сегмент кода. Причём слово _TEXT не является зарtзервированным. А по завершении пишет _TEXT ENDS.
Другой же автор пишет что достаточно просто написать .code и всё!
И исходя из всего этого, переменные можно объявлять только в одном месте? И нет такого понятия как в c++ глобальные/локальные переменные?

Добавлено через 3 минуты
А Олег Калашников в своей книге вообще пишет в начале каждого листинга:
assume cs:CSEG, ds:CSEG, es:CSEG, SS:CSEG
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
30.06.2011, 19:45
Ответы с готовыми решениями:

Чем определяется одинаковость урлов /page?FAQ и /page.php?FAQ
Подскажите, пожалуйста, какая опция php или настройка сервера позволяет не указывать .php в урлах? Просто раньше у меня на сайте работал...

Указатели и указатели на указатели, а также типы данных
Недавно начал изучать Си, перешел с Delphi. Много непонятного и пока процесс идет медленно. Накачал литературы, буду изучать) Щас...

Сегменты отката
Вопрос касательно Oracle 11 Если параметр undo_management стоит в Auto имеет ли смысл настраивать сегменты отката? а именно initial, next...

26
2014 / 1286 / 61
Регистрация: 05.06.2010
Сообщений: 2,213
30.06.2011, 21:06
Лучший ответ Сообщение было отмечено как решение

Решение

Цитата Сообщение от Dimarik__ Посмотреть сообщение
Вот есть функция DeleteFileW, в МСДН написано что она принимает const char* то есть LPCTSTR.
опять повторюсь про суффикс W. Если он есть, строка передается в юникоде, а значит она принимает const wchar_t* , то есть LPCWSTR.

Цитата Сообщение от Dimarik__ Посмотреть сообщение
Объявляю переменную:
в сегменте кода
DB_fileAdress DD ?;адрес файла
по размеру видно что это не сама строка, а УЖЕ УКАЗАТЕЛЬ, то есть 4-х байтовый адрес строки, и запись
Цитата Сообщение от Dimarik__ Посмотреть сообщение
push offset DB_fileAdress
означает указатель на указатель, и естественно возвращает ошибку. Если бы ты объявил например
Assembler
1
file_name db "file.txt", 0
то это была бы САМА СТРОКА и тут offset был бы необходим.
Цитата Сообщение от Dimarik__ Посмотреть сообщение
2. Объясните, пожалуйста, зачем нужны эти сегменты. Потом что один автор пишет что нужно писать _TEXT segment - это типа сегмент кода. Причём слово _TEXT не является зарtзервированным. А по завершении пишет _TEXT ENDS.
Другой же автор пишет что достаточно просто написать .code и всё!
И исходя из всего этого, переменные можно объявлять только в одном месте?
У тебя сейчас обычная путаница, которая возникает при переходе от dos к windows. Никаких сегментов больше нет, забудь про них. Все что ты выделишь в .data будет хранится в секции данных в файле PE формата (exe или dll для windows) и буде являться глобальными переменными, а все что в .code будет в секции кода.

Цитата Сообщение от Dimarik__ Посмотреть сообщение
И нет такого понятия как в c++ глобальные/локальные переменные?
Ну как же, есть конечно. Про глобальные переменные уже сказал, теперь про локальные. Наиболее распространенный способ хранения локальных переменных в процедуре - стек. Принято располагать локальные переменные в стеке сразу после сохраненного значения регистра ebp, так что на них можно ссылаться изнутри процедуры, примерно так:
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
; parametrs
param1       equ     dword ptr [ebp+8]
param2       equ     dword ptr [ebp+12]
param3       equ     dword ptr [ebp+16]
 
; locals
var1    equ     dword ptr [ebp-4]       ;dword
var2    equ     qword ptr [ebp-12]     ;qword
 
 
test_proc  proc
push    ebp
mov     ebp, esp
sub     esp, 12
...
тело функции
...
mov     esp, ebp
pop     ebp
retn
test_proc  endp
что аналогично
C++
1
2
3
4
5
6
7
8
any_type test_proc(long param1, int param2, char* param3)
{
   int var1;
   double var2;
...
тело функции
...
}
тип данных взял произвольный 4-х байтовый, ассемблер их не различает (различает только по размеру).
В masm32 можно также использовать директиву LOCAL, которая значительно облегчает жизнь: не надо высчитывать адреса параметров в стеке. Область стека, отводимая под локальные переменные называется кадром стека.
Цитата Сообщение от Dimarik__ Посмотреть сообщение
А Олег Калашников в своей книге вообще пишет в начале каждого листинга:
assume cs:CSEG, ds:CSEG, es:CSEG, SS:CSEG
это только для tasm'a и только под дос, про это тоже забудь
3
2838 / 1647 / 254
Регистрация: 03.12.2007
Сообщений: 4,222
30.06.2011, 21:07
DeleteFileW принимает LPCWSTR = const wchar_t*
offset - смещение. А в DB_fileAdress у тебя адрес. Получается, берётся адрес адреса строки.
[Не успел...]
1
 Аватар для Dimarik__
21 / 21 / 3
Регистрация: 29.04.2010
Сообщений: 444
01.07.2011, 11:15  [ТС]
Такой же вопрос из области FAQ. Отладку лучше всего в OllyDebugger делать? То есть вставляю я туда свой ехе и делаю отладку. Просто код там оказывается малость изменённым (вместо названий функций, например , идут адреса). Немножко не так как во встроенном отладчике в Вижуал. Или это нормальное явление и надо к такому начинать потихоньку привыкать после использования языков программирования высокого уровня?
0
1779 / 757 / 153
Регистрация: 03.06.2009
Сообщений: 5,940
01.07.2011, 13:51
Можно попробовать tasm32/td32 для windows, он позволяет запихивать в экзешник отладочную информацию, так что в отладчике программа выглядит как исходный текст, но эта система уже много лет не развивается, и подойдет только для начального обучения, для отладки более или менее серьезных программ лучше пользоваться Olly.
0
 Аватар для Dimarik__
21 / 21 / 3
Регистрация: 29.04.2010
Сообщений: 444
01.07.2011, 16:03  [ТС]
я через MASM32 пишу
0
43 / 42 / 5
Регистрация: 22.06.2011
Сообщений: 71
01.07.2011, 19:52
А транслируешь программу хоть с ключом, сохраняющим отладочную информацию? Т.е., например, так:
ml /c /coff *.asm
0
 Аватар для Dimarik__
21 / 21 / 3
Регистрация: 29.04.2010
Сообщений: 444
01.07.2011, 22:18  [ТС]
да. я так транслирую. но в olly вставляю потом ехе и у меня не очень читабельно всё выдаёт она
0
43 / 42 / 5
Регистрация: 22.06.2011
Сообщений: 71
01.07.2011, 22:38
Может ты не то окошко в Olly смотришь? Чтобы посмотреть код с символьной информацией надо открыть окно CPU (View-CPU или ALT+C)
1
 Аватар для Dimarik__
21 / 21 / 3
Регистрация: 29.04.2010
Сообщений: 444
09.07.2011, 11:14  [ТС]
Assembler
1
2
3
4
5
6
7
8
; parametrs
param1       equ     dword ptr [ebp+8]
param2       equ     dword ptr [ebp+12]
param3       equ     dword ptr [ebp+16]
 
; locals
var1    equ     dword ptr [ebp-4]       ;dword
var2    equ     qword ptr [ebp-12]     ;qword
А разве equ не означает что это константа?
0
 Аватар для 6a6kin
232 / 102 / 5
Регистрация: 18.04.2010
Сообщений: 294
09.07.2011, 12:55
Нет.
equ - это практически define в c/c++, значит препроцессор(до компиляции самой программы) вместо var1 подставляет dword ptr [ebp-4]. Фактически, это назначение имени для какого-нибудь выражения или строки.
1
 Аватар для Dimarik__
21 / 21 / 3
Регистрация: 29.04.2010
Сообщений: 444
26.07.2011, 13:57  [ТС]
Скажите, пожалуйста, что необходимо подключить, чтобы MASM стал понимать функцию CreateWindow?
Име.тся подключения:
Assembler
1
2
3
4
5
6
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
Но почему-то компилятор понимает CreateWindowEx, а просто CreateWindow не понимает. Пишет что underfined symbol
0
1779 / 757 / 153
Регистрация: 03.06.2009
Сообщений: 5,940
26.07.2011, 14:10
Нет такой функции - это макрос си для CreateWindowEx с первым параметром=0.
Эта функция была в 16-разрядном API Windows 3.11
1
 Аватар для Dimarik__
21 / 21 / 3
Регистрация: 29.04.2010
Сообщений: 444
26.07.2011, 14:25  [ТС]
Хочу создать простое окошко. Вот такие ошибки вылезли:
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
Microsoft (R) Macro Assembler Version 6.14.8444
Copyright (C) Microsoft Corp 1981-1997.  All rights reserved.
 
 Assembling: informer.asm
informer.asm(49) : error A2008: syntax error : addr
informer.asm(76) : error A2012: PROC, MACRO, or macro repeat directive must prec
ede LOCAL
informer.asm(78) : error A2008: syntax error : addr
informer.asm(84) : error A2008: syntax error : addr
informer.asm(86) : error A2008: syntax error : addr
informer.asm(90) : error A2006: undefined symbol : msg
 
c:\masm32\bin>
Вложения
Тип файла: zip window__1.zip (1.2 Кб, 9 просмотров)
0
1779 / 757 / 153
Регистрация: 03.06.2009
Сообщений: 5,940
26.07.2011, 15:11
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
.686
.model flat, stdcall
option casemap :none; теперь MASM32 начнёт различать регистры
 
include windows.inc
include kernel32.inc
include user32.inc
;подключаем библиотеки
includelib kernel32.lib
includelib user32.lib
 
.data
    hInstance       HINSTANCE   ?
    className       DB          "Windows informer",0
.code
Start:
    ;функция WinMain
    WinMain proc hInst:HINSTANCE, hPrevInst:HINSTANCE, IpszCmdLine:BYTE, nCmdShow:DWORD
        LOCAL hMainWnd:HWND
        LOCAL wc:WNDCLASSEX
        LOCAL msg:MSG
 
        
        ; заполняем структуру класса окна
        mov wc.cbSize,sizeof wc
        mov wc.style,CS_HREDRAW+CS_VREDRAW
        mov wc.lpfnWndProc, offset WndProc
        mov wc.cbClsExtra, 0
        mov wc.cbWndExtra, 0
        mov EAX, hInst
        mov wc.hInstance, EAX
        
            ;вызываем LoadIcon
            push IDI_APPLICATION
            push 0
            call LoadIcon
        mov wc.hIcon, EAX
            
            ;вызываем LoadCursor
            push IDC_ARROW
            push 0
            call LoadCursor
        mov wc.hCursor, EAX
        mov wc.hbrBackground, COLOR_WINDOW+1
        mov wc.lpszMenuName, 0
        mov wc.lpszClassName, offset className
        mov EAX, wc.hIcon
        mov wc.hIconSm, EAX
        
        ;регистрируем класс окна
        lea eax,wc
        push  eax
        call RegisterClassEx
        cmp EAX, 0;проверка на ошибку
            jz Exit
        
        ;создаём новое окно приложения
        push 0
        push hInstance
        push 0; (HMENU) NULL
        push 0; (HWND)NULL
        push CW_USEDEFAULT
        push CW_USEDEFAULT
        push 0 
        push 0
        push WS_OVERLAPPEDWINDOW
        push offset className
        push offset className
        push 0
        call CreateWindowEx
        cmp EAX, 0;проверка на ошибку
            jz Exit
        
        ;показываем окно
        push 
        push EAX
        call ShowWindow
        
        ;выполняем цикл обработки сообщений до закрытия приложения
    Label_cycle_messages:
        push 0
        push 0
        push 0
        lea eax,msg
        push eax
        call GetMessage
        cmp EAX,0
        jz  Exit
        lea eax,msg
        push eax
        call TranslateMessage
        lea eax,msg
        push eax
        call DispatchMessage
        jmp Label_cycle_messages
    Exit:
 
        mov EAX, msg.wParam
        push eax
        call ExitProcess
    WinMain endp
 
    WndProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM
        cmp uMsg, WM_CLOSE
            jnz label_1
        push hWnd
        call DestroyWindow
        jmp label_Exit
    label_1:
        cmp uMsg, WM_DESTROY
            jnz label_2
        push hWnd
        call DestroyWindow
    label_2:
        ;вызываем DefWindProc
        push lParam
        push wParam
        push uMsg
        push hWnd
        call DefWindowProc
    label_Exit:
        ret
    WndProc endp
end Start
Главное: Параметры в функции нужно записывать в стек в обратном порядке, либо пользоваться макросом invoke
1
 Аватар для Dimarik__
21 / 21 / 3
Регистрация: 29.04.2010
Сообщений: 444
26.07.2011, 21:18  [ТС]
как я понял, локальные переменные можно объявлять только в начала процедуры? И посреди там где тебе захочется нельзя?
0
1779 / 757 / 153
Регистрация: 03.06.2009
Сообщений: 5,940
26.07.2011, 21:32
да, и смещение локальных переменных получить нельзя, нужно загружать их эффективный адрес (lea)
1
 Аватар для Dimarik__
21 / 21 / 3
Регистрация: 29.04.2010
Сообщений: 444
27.07.2011, 12:29  [ТС]
вопрос по строкам. Вот в самом начале в .data определена строка
Assembler
1
str1 DB "111",0
как при помощи WinApi можно выполнить конкатенацию это строки с строкой "23",0?????
И обязательно ли для этого вторую строку объявлять как отдельную переменную?
0
1779 / 757 / 153
Регистрация: 03.06.2009
Сообщений: 5,940
27.07.2011, 16:46
Assembler
1
2
3
str1 DB "111", 10 dup (0)
str2 DB "222",0
invoke strcat,offset str1,offset str2
str1=str1+str2

Добавлено через 4 часа 12 минут
Пардон, не strcat, a lstrcat
1
 Аватар для Dimarik__
21 / 21 / 3
Регистрация: 29.04.2010
Сообщений: 444
28.07.2011, 08:41  [ТС]
str1 DB "111", 10 dup (0) - только тут не понятно, зачем после строки 10 нулей нужно?

Добавлено через 27 секунд
а если заранее неизвестны длины строк?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
28.07.2011, 08:41
Помогаю со студенческими работами здесь

Сегменты программ!
Помогите пожалуйста разобраться ! Программа написанная на исходном коде должно быть откомпилирована, после обработана компановщикам, уже...

Сегменты кода
Подскажите пожалуйста, можно ли в vs добавлять сегменты? Т.е. допустим у метода есть слева такой минус, на него нажимаешь и метод...

Задать сегменты номенклатуры
всем привет. ковыряюсь в ут - нужно сделать акцию задаю номенклатуру с отоборм - все ок. все работает. как только добаляю...

Сегменты памяти AVR
Добрый день! Объясните мне пожалуйста значение сегментов памяти у МК AVR и использование директив CSEG, DSEG и ESEG. Когда их надо...

Разделяемые сегменты памяти
Допустим у нас есть структура с нужными нам данными. Как структуру правильно записать в память и изменять ее поля на сервере? Сервер:...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
Расскажи мне о Мире, бродяга
kumehtar 12.11.2025
— Расскажи мне о Мире, бродяга, Ты же видел моря и метели. Как сменялись короны и стяги, Как эпохи стрелою летели. - Этот мир — это крылья и горы, Снег и пламя, любовь и тревоги, И бескрайние. . .
PowerShell Snippets
iNNOKENTIY21 11.11.2025
Модуль PowerShell 5. 1+ : Snippets. psm1 У меня модуль расположен в пользовательской папке модулей, по умолчанию: \Documents\WindowsPowerShell\Modules\Snippets\ А в самом низу файла-профиля. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru