Форум программистов, компьютерный форум, киберфорум
Assembler: Windows/protected mode
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/15: Рейтинг темы: голосов - 15, средняя оценка - 4.67
Прощай, Мир!
 Аватар для proc3nt
1673 / 831 / 253
Регистрация: 26.05.2012
Сообщений: 3,056
MASM

Выделение динамической памяти для строки. Вывод строки. Строка выводится кракозябрами

20.05.2019, 20:49. Показов 2985. Ответов 5
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
здр. имеется следующая программа.. при выводе сообщения со строками из динамической памяти выводятся кракозябры.. пжл, подскажите мне что я делаю не так..

напишите процедуру, которая принимает дескриптор хипа (динамическая память) и смещение строки.. процедура выделяет достаточно памяти на хипе, чтобы сохранить строку три раза.. затем в хип записывается три копии строки.. процедура возвращает указатель на выделенную память.. используя эту процедуру выведите строку с хипа и освободите память..
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
.386
.model flat,stdcall
 
option casemap:none
 
include \masm32\include\windows.inc
include \masm32\include\masm32.inc
include \masm32\include\gdi32.inc
include \masm32\include\user32.inc
include \masm32\include\kernel32.inc
includelib \masm32\lib\masm32.lib
includelib \masm32\lib\user32.lib
includelib \masm32\lib\kernel32.lib    
 
.data
hnd dd ?
buf dd ?
arr db "I love you!"
len = $-arr
times dd ?
 
.code
main proc
    invoke HeapCreate,HEAP_NO_SERIALIZE,0,0
 
    mov hnd,eax
 
    push eax    
 
    mov eax,offset arr
 
    push eax
 
    call strheap
 
    invoke ExitProcess,0
main endp
 
strheap proc
    push ebp        
    mov ebp,esp
 
    mov eax,3
    mov ecx,len
    mul ecx
    inc eax
 
    mov times,eax
 
    mov ebx,[ebp+12]    
 
    invoke HeapAlloc,ebx,HEAP_NO_SERIALIZE,times
 
    mov buf,eax
 
    mov edi,eax
    mov ecx,3
    three:
        push ecx
 
        mov esi,[ebp+8]
        mov ecx,len
        copy:
            lodsb
            stosb
        loop copy
 
        pop ecx
    loop three
    
    mov byte ptr [edi],0
 
    invoke MessageBoxA,NULL,ADDR buf,NULL,MB_OK
 
    invoke HeapFree,hnd,NULL,buf
 
    invoke HeapDestroy,hnd
 
    pop ebp         
 
    retn 8          
strheap endp
end main
Добавлено через 8 минут
Цитата Сообщение от proc3nt Посмотреть сообщение
invoke MessageBoxA,NULL,ADDR buf,NULL,MB_OK
ой, все.. решил проблему..
Assembler
1
invoke MessageBoxA,NULL,buf,NULL,MB_OK
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
20.05.2019, 20:49
Ответы с готовыми решениями:

Выделение и удаление памяти, выделенной для динамической строки
Данная функция производит ввод и собственно контроль ввода (размер массива от 1 до 20, иначе должна выдавать ошибку; при вводе букв также...

Выделение памяти для строки
Почему размер строки первой 4 байта а второй 50 байт?Первая должна сколько же. #include <stdio.h> #include <Windows.h> ...

Выделение памяти для строки символов
Нужно выделить память под массив указателей на строки, ввести текст построчно динамически выделяя память для каждой строки и записывая...

5
Эксперт Hardware
Эксперт Hardware
 Аватар для R71MT
6206 / 2441 / 402
Регистрация: 29.07.2014
Сообщений: 3,174
Записей в блоге: 4
20.05.2019, 23:33
proc3nt, вообще-то у процесса есть уже куча, а ты создаёшь ещё одну..
её хендл возвращает GetProcessHeap().
по-сути это даже не хендл, а адрес начала текущей кучи в памяти.
теперь этот адрес/хендл можешь подставлять в алокатор,
причём если выставить в нём флаг(Zero), то выделенная память забьётся нулями,
который будет служит терминальным нулём при выводе строки на экран.
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
format      pe gui
include    'win32ax.inc'
 
.data  ;---------
hndl       dd   0
buff       dd   0
str0       db  'Example '
sLen       =    $-str0
 
.code  ;---------
start:     invoke   GetProcessHeap    ; запросить дескриптор текущей кучи
           mov      [hndl],eax        ;
           push     eax str0          ; дескриптор кучи, и адрес строки
          stdcall   strheap           ;
 
           invoke   MessageBox,0,[buff],0,0
           invoke   HeapFree,[hndl],0,[buff]
           invoke   ExitProcess,0
;------
proc       strheap, string, handle
           invoke   HeapAlloc,[handle],1000b,sLen*4   ; флаг "HEAP_ZERO_MEMORY"
           mov      [buff],eax
           mov      esi,[string]                      ; аргумент со-стека (источник)
           mov      edi,eax                           ; приёмник = выделенная куча
           push     esi esi                           ; для трёх раз
           mov      ebx,3                             ; счётчик
@@:        mov      ecx,sLen                          ; длина строки для rep
           rep      movsb                             ; копируем!
           pop      esi                               ; восстановить источник
           dec      ebx                               ;
           jnz      @b                                ; повторить 3-раза
           ret                                        ;
endp
.end start
1
Прощай, Мир!
 Аватар для proc3nt
1673 / 831 / 253
Регистрация: 26.05.2012
Сообщений: 3,056
21.05.2019, 09:06  [ТС]
Цитата Сообщение от R71MT Посмотреть сообщение
sLen*4
R71MT, спасибо за предоставленную информацию.. довольно-таки познавательно..
только почему ты выделяешь память именно в четыре раза большую, чем длина исходной строки?
0
Эксперт Hardware
Эксперт Hardware
 Аватар для R71MT
6206 / 2441 / 402
Регистрация: 29.07.2014
Сообщений: 3,174
Записей в блоге: 4
21.05.2019, 11:59
Цитата Сообщение от proc3nt Посмотреть сообщение
в четыре раза большую, чем длина исходной строки?
..это от фонаря (всё-равно там 4-страницы пустуют)
можешь сделать sLen+1
Вот скрины где показано, что дефолтная куча лежит по адресу 80000,
а после выделения в ней памяти, указатель смещается на некоторое кол-во байт, причём там валяется мусор (см.скрин 2). А вот если установить флаг "Heap_Zero_Memory", то выделенная область забивается нулями - хвост будет маркером конца строки.
Миниатюры
Выделение динамической памяти для строки. Вывод строки. Строка выводится кракозябрами   Выделение динамической памяти для строки. Вывод строки. Строка выводится кракозябрами  
1
Прощай, Мир!
 Аватар для proc3nt
1673 / 831 / 253
Регистрация: 26.05.2012
Сообщений: 3,056
21.05.2019, 12:55  [ТС]
Цитата Сообщение от R71MT Посмотреть сообщение
можешь сделать sLen+1
R71MT, ты наверное имел ввиду
sLen*3+1
1
 Аватар для hebdo
-10 / 4 / 1
Регистрация: 20.05.2019
Сообщений: 16
21.05.2019, 13:15
Цитата Сообщение от R71MT Посмотреть сообщение
это от фонаря
все правильно строки то тоже разные бывают, если широкие - размерчик то что надо
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
21.05.2019, 13:15
Помогаю со студенческими работами здесь

Выделение памяти для большой строки
Здравствуйте! Необходиом выделить память большого размера для массива - текстовой информации ( около 1000000 wchar_t). Использую чистый Си....

Динамическое выделение памяти для строки
Добрый день. Такой вопрос возник: При создании строки с помощью указателя на char и ввода с помощью cin значения, то есть char *x; ...

Динамическое выделение памяти для строки
Подскажите, пожалуйста , почему в данной программе появляются ошибки в строке return Vector(v1.x + v2.x, v1.y + v2.y, v1.cp +...

Выделение нужного количества памяти для строки
Задача состоит в том, чтобы считать кол-во символов в файле, выделить ровно под эту строку память, и записать её, после чего вывести на...

Выделение динамической памяти для char
Здравствуйте, возник вопрос: как выделить память для char массива? Вот, что делаю я: #include "stdafx.h" ...


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
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
— Расскажи мне о Мире, бродяга, Ты же видел моря и метели. Как сменялись короны и стяги, Как эпохи стрелою летели. - Этот мир — это крылья и горы, Снег и пламя, любовь и тревоги, И бескрайние. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru