Форум программистов, компьютерный форум, киберфорум
Assembler, MASM, TASM
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.83/6: Рейтинг темы: голосов - 6, средняя оценка - 4.83
1 / 1 / 0
Регистрация: 07.01.2015
Сообщений: 48

Непредсказуемое изменение хэндла вывода (STD_OUTPUT_HANDLE) консольной программой

05.07.2015, 16:44. Показов 1201. Ответов 2
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Прошу помочь разобраться, что происходит с хэндлом вывода. Почему-то указатель на хэндл для функции WriteConsoleA внутри процедуры PrintNumber (пометил как (1)) отличается от указателя, передающего следующему вызову WriteConsoleA (2)), причем он изменяется после первой итерации циКла CileOut, а дальше остается неизменным. Из-за этого программа не выводит на консоль разделяющие пробелы (хотя и числа она выводит неправильно, но не об этом сейчас речь). Если перед вторым вызовом добавить функцию GetStdHandle, то программа печатает пробелы нормально. Посмотреть указатели можно на скринах отладки OllyDbg (первая итерация и остальные). Полный код программы в архиве 7z.
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
.486
.model flat,stdcall
option casemap:none
 
includelib kernel32.lib
include c:\masm32\include\windows.inc
include c:\masm32\include\kernel32.inc
 
SetConsoleTitleA proto :dword
GetStdHandle proto :dword
WriteConsoleA proto :dword,:dword,:dword,:dword
ExitProcess proto :dword
Sleep proto :dword 
OrintNumber proto                              ;!!попробовать описать как прототип
 
.const                 ; некоторые сообщения не используются
  ConTitle db 'Умножение матриц',0
  MsgDlg db 'Введите матрицу А'
  nm3=$-MsgDlg
  MsgDlg1 db 'Введите матрицу B'
  nm4=$-MsgDlg1
  MsgDlg2 db 'Матрица С:',13,10
  nm5=$-MsgDlg2
  MsgWrongData1 db 'Введены не верные данные, n1!=m2'
  nm1=$-MsgWrongData1
  MsgWrongData2 db 'Введены не верные данные, n2!=m1'
  nm2=$-MsgWrongData2
  space db ' '
.data
  n1 dw 4                           ; 7 6 1 2     2 6 1
  m1 dw 3                           ; 3 7 8 9  *  7 3 2   =
  n2 dw 3                           ; 9 6 5 1     1 1 4
  m2 dw 4                           ;             7 9 4
  a dw 7,6,1,2,3,7,8,9,9,6,5,1      ;
  b dw 2,6,1,7,3,2,1,1,4,7,9,4      ;
  cm dw 100 dup (?)
.code
 
Main proc
  local hStdout:dword                         ;попробывать syzeof 
  local hStdinp:dword                         
 
  invoke SetConsoleTitleA, offset ConTitle
  invoke GetStdHandle, STD_OUTPUT_HANDLE
  mov hStdout,eax
;-------------проверка допустимости умножения----
 
  ...
 
;--------------начала расчета--------------------
  ...
 
;---------------------Вывод матрицы---------------
  invoke GetStdHandle, STD_OUTPUT_HANDLE
  mov hStdout,eax
  xor edx,edx
  xor eax,eax
  lea ebx,cm
  CicleOut:
    push edx
    xor edx,edx
    CicleOut1:
      xor eax,eax
      mov al,byte ptr [ebx]   ; элементы С занимают два байта!
      mov ah,byte ptr [ebx+1] ; старшая часть правее
      push edx
      push eax
      call PrintNumb      ;(1)
      invoke WriteConsoleA, hStdout,offset space , 1, NULL, NULL ;(2)
      pop edx
      inc ebx
      inc ebx
      inc edx
    cmp dx,n1
    jne CicleOut1
 
    pop edx
    inc edx
  cmp dx,m2
  jne CicleOut 
 
  call WaitExit
Main endp
 
;------------процедура выхода с ожиданием-----------------------
...
;------------процедура записи--------------------------
PrintNumb proc numb:dword
local buf[20]:byte
local PrintNumbhStdout:dword
 
  push eax
  push ecx
  push edx
  push edi
;  mov eax, [ebp+12]
  mov eax, numb
 
  mov ebx,10
  xor ecx, ecx
  lea edi, buf
  add edi,20     ; запись с конца в начало (будем заносить остатки
                 ; от деления на 10)
  DLoop:
    xor edx,edx
    div ebx     ; выделяем остаток
    inc cx      ; сх = количество записанных цифр  (остатков от делений)
    add dl,'0'
    mov byte ptr [edi], dl 
    dec di
  test eax, eax ; ax=0?
  jnz DLoop     ; 
 
  mov ebx, edi 
  inc ebx       ; в начало символьной строки
  invoke GetStdHandle, STD_OUTPUT_HANDLE
  mov PrintNumbhStdout,eax
  invoke WriteConsoleA, PrintNumbhStdout ,ebx, ecx, NULL, NULL
 
  pop edi
  pop edx
  pop ecx
  pop eax
  ret 
PrintNumb endp
 
end Main
Миниатюры
Непредсказуемое изменение хэндла вывода (STD_OUTPUT_HANDLE) консольной программой   Непредсказуемое изменение хэндла вывода (STD_OUTPUT_HANDLE) консольной программой  
Вложения
Тип файла: 7z winmatrix.7z (2.0 Кб, 1 просмотров)
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
05.07.2015, 16:44
Ответы с готовыми решениями:

Работа с консольной программой
Доброго дня, я уже перечитал много тем, топиков, как тут, так и на других сайтах. Тем не менее мне не понятно с чего начать и что...

Работа с консольной программой в каталоге
Здравствуйте. У меня есть непонимание следующего вопроса. В каталоге лежит консольная программа. Программу нужно вызвать, к примеру, 10...

Как провести диалог с консольной программой?
Всем привет! Есть одна программа - cut3d (не имеет значение). Она не имеет графического интерфейса и диалог юзера и программы...

2
Клюг
 Аватар для Charles Kludge
7677 / 3192 / 382
Регистрация: 03.05.2011
Сообщений: 8,380
10.07.2015, 20:08
Цитата Сообщение от BOEH Посмотреть сообщение
Прошу помочь разобраться, что происходит с хэндлом вывода.
Просто пользоваться сюшной библиотекой msvcrt.dll.
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
;...
include msvcrt.inc
include macros.asm
includelib masm32.lib
includelib msvcrt.lib
;...
.const                 ; некоторые сообщения не используются
tpt db  '%5d %5d %5d %5d',0Dh,0Ah,0
;...
.code
;...
;-------------проверка допустимости умножения----
 
  mov ax,m1
  .if ax!=n2
    invoke WriteConsoleA, hStdout,offset MsgWrongData1, nm1, NULL, NULL
;    call WaitExit
    jmp gtfo
  .endif
;...
;---------------------Вывод матрицы---------------
    movzx   ecx, [n2]
    lea esi, cm
@@: push    ecx
    lodsw
    movsx   edx, ax 
    lodsw
    movsx   ecx, ax 
    lodsw
    movsx   ebx, ax 
    lodsw
    invoke  crt_printf, addr tpt, edx, ecx, ebx, eax
    pop ecx
    loop    @B
gtfo:   invoke  crt__getch
    invoke  crt_exit,0
Main endp
end Main
; всё, что ниже - просто не нужно.
Как-то так.
1
1 / 1 / 0
Регистрация: 07.01.2015
Сообщений: 48
11.07.2015, 05:14  [ТС]
Спасибо, но я хотел просто разобраться, почему адрес локальной переменной меняется. С чем-то подобным уже не первый раз сталкиваюсь
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
11.07.2015, 05:14
Помогаю со студенческими работами здесь

Какой программой делают расчет консольной балки
Расчет консольной балки скажите пожалуйста,какой программой ее делают? Заранее спасибо!

Связь приложения с консольной программой, написанной на SWI Prolog
Господа, АЛАРМ! Пишу прогу на Delphi. Она должна связаться с консольной программой, написанной на SWI Prologe. но....не связывается....

Сохранение вывода консольной программы
Доброго времени суток. Программа запускает сторонние консольные приложения(ml.exe, link.exe. да да, компилит асм исходники:) ) Как...

Обработка вывода консольной программы
Здравствуйте. Нужно в Unix системе обработать вывод программы df. А именно получить путь смонтированного USB устройства Все бы хорошо, но я...

Кодировка при чтении вывода консольной команды
Доброго времени суток, подскажите как исправить проблему. У меня маленькое приложение, оно запускает в фоном CMD. После на форме есть...


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Символьное дифференцирование
igorrr37 13.02.2026
/ * Программа принимает математическое выражение в виде строки и выдаёт его производную в виде строки и вычисляет значение производной при заданном х Логарифм записывается как: (x-2)log(x^2+2) -. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru