Форум программистов, компьютерный форум, киберфорум
Assembler для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/9: Рейтинг темы: голосов - 9, средняя оценка - 5.00
10 / 10 / 4
Регистрация: 06.05.2009
Сообщений: 34
1

Вывод текущих значений основных регистров в реальном времени

05.12.2010, 21:35. Показов 1884. Ответов 7
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Всем доброго времени суток! Нужна помощь в написании программы. Задача такая
"Разработать приложения для определений реальной частоты процессора и просмотра данных основных регистров в реальном времени (Windows)".
С частотой процессора разберусь позже, а пока не ясно, как в windows получить реальные значения, содержащиеся в регистрах в данный момент. Написал следующую программу
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
.386
.model flat,stdcall
option casemap:none
 
include 123123123.inc
 
.code
 
start:
 
    invoke GetModuleHandle,NULL
    mov    hInstance,eax
    invoke WinMain,hInstance,NULL,NULL,SW_SHOWDEFAULT
    invoke ExitProcess,eax
 
WinMain proc hInst:HINSTANCE,hPrevInst:HINSTANCE,CmdLine:LPSTR,CmdShow:DWORD
    LOCAL   wc:WNDCLASSEX
    LOCAL   msg:MSG
 
    mov     wc.cbSize,sizeof WNDCLASSEX
    mov     wc.style,CS_HREDRAW or CS_VREDRAW
    mov     wc.lpfnWndProc,offset WndProc
    mov     wc.cbClsExtra,NULL
    mov     wc.cbWndExtra,DLGWINDOWEXTRA
    push    hInst
    pop     wc.hInstance
    mov     wc.hbrBackground,COLOR_BTNFACE+1
    mov     wc.lpszClassName,offset ClassName
    invoke LoadIcon,NULL,IDI_APPLICATION
    mov     wc.hIcon,eax
    mov     wc.hIconSm,eax
    invoke LoadCursor,NULL,IDC_ARROW
    mov     wc.hCursor,eax
    invoke RegisterClassEx,addr wc
    invoke CreateDialogParam,hInstance,IDD_DIALOG,NULL,addr WndProc,NULL
    invoke ShowWindow,hWnd,SW_SHOWNORMAL
    invoke UpdateWindow,hWnd
    
    ;------------timer--------------------
    invoke SetTimer,hWnd,timer,500,NULL
    .while TRUE
        invoke GetMessage,addr msg,NULL,0,0
      .BREAK .if !eax
        invoke TranslateMessage,addr msg
        invoke DispatchMessage,addr msg
    .endw
    mov     eax,msg.wParam
        
    ;------------delete timer--------------------
    invoke KillTimer,hWnd,timer
    ret
    
    
WinMain endp
 
WndProc proc hWin:HWND,uMsg:UINT,wParam:WPARAM,lParam:LPARAM
    
    LOCAL ps:PAINTSTRUCT
    LOCAL rect:RECT
    
    ;------rectangle for repaint-----   
    mov ebx,10
    mov rect.top,ebx    
    mov ebx,70
    mov rect.left,ebx   
    mov ebx,190
    mov rect.bottom,ebx 
    mov ebx,120
    mov rect.right,ebx
    
    mov     eax,uMsg
    .if eax==WM_INITDIALOG
        push    hWin
        pop     hWnd
        
        invoke CreateWindowEx,WS_EX_CLIENTEDGE, ADDR namest1,NULL,WS_CHILD or WS_VISIBLE or WS_BORDER or ES_LEFT or ES_AUTOHSCROLL,70,10,120,20,hWin,static1,hInstance,NULL
        mov  hwndstatic1,eax    
        invoke CreateWindowEx,WS_EX_CLIENTEDGE, ADDR namest2,NULL,WS_CHILD or WS_VISIBLE or WS_BORDER or ES_LEFT or ES_AUTOHSCROLL,70,40,120,20,hWin,static2,hInstance,NULL
        mov  hwndstatic2,eax
        invoke CreateWindowEx,WS_EX_CLIENTEDGE, ADDR namest3,NULL,WS_CHILD or WS_VISIBLE or WS_BORDER or ES_LEFT or ES_AUTOHSCROLL,70,70,120,20,hWin,static3,hInstance,NULL
        mov  hwndstatic3,eax    
        invoke CreateWindowEx,WS_EX_CLIENTEDGE, ADDR namest4,NULL,WS_CHILD or WS_VISIBLE or WS_BORDER or ES_LEFT or ES_AUTOHSCROLL,70,100,120,20,hWin,static4,hInstance,NULL
        mov  hwndstatic4,eax
                
        call print
        
    .elseif eax==WM_TIMER
        .if wParam==timer
            invoke InvalidateRect, hWin,addr rect,TRUE
        .endif
    .elseif eax==WM_PAINT
            invoke BeginPaint,hWin, ADDR ps
                call print
            invoke EndPaint,hWin, ADDR ps               
    .elseif eax==WM_CLOSE
        invoke DestroyWindow,hWin
    .elseif uMsg==WM_DESTROY
        invoke PostQuitMessage,NULL
    .else
        invoke DefWindowProc,hWin,uMsg,wParam,lParam
        ret
    .endif
    xor    eax,eax
    ret
 
WndProc endp
 
print proc
    
    push eax
    lea esi,msg1 
    call reform
        
    push ebx
    lea esi,msg2 
    call reform
    
    push ecx
    lea esi,msg3 
    call reform
    
    push edx
    lea esi,msg4 
    call reform
    
    invoke SetWindowText,hwndstatic1,ADDR msg1
    invoke SetWindowText,hwndstatic2,ADDR msg2
    invoke SetWindowText,hwndstatic3,ADDR msg3
    invoke SetWindowText,hwndstatic4,ADDR msg4
    ret
 
print endp
 
reform proc
    pop edx
    pop ebx
    push edx
        
    invoke wsprintf,addr text, addr t, ebx
        
    mov ecx,8
    lea edi,text
    
    cycle:
    mov bl,[edi]
    mov [esi],bl
    inc edi
    inc esi
    loop cycle
    ret 
    
reform endp
 
end start
где 123123123.inc
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
include windows.inc
include user32.inc
include kernel32.inc
include shell32.inc
include comctl32.inc
include comdlg32.inc
 
includelib user32.lib
includelib kernel32.lib
includelib shell32.lib
includelib comctl32.lib
includelib comdlg32.lib
 
WinMain             PROTO :DWORD,:DWORD,:DWORD,:DWORD
WndProc             PROTO :DWORD,:DWORD,:DWORD,:DWORD
 
.const
 
ClassName           db 'DLGCLASS',0
AppName             db 'Curs',0
 
IDD_DIALOG          equ 1000
static1             equ 1
static2             equ 2
static3             equ 3
static4             equ 4
timer               equ 99
 
.data?
 
hInstance           dd ?
CommandLine         dd ?
hWnd                dd ?
 
hwndstatic1         HWND ?
hwndstatic2         HWND ?
hwndstatic3         HWND ?
hwndstatic4         HWND ?
 
.data
namest1 db "static",0
namest2 db "static",0
namest3 db "static",0
namest4 db "static",0
t db "%x",0
 
msg1    db 50 dup(0)
msg2    db 50 dup(0)
msg3    db 50 dup(0)
msg4    db 50 dup(0)
 
text    db 50 dup(0)
Здесь выводятся значения регистров eax, ebx, ecx и edx, а затем обновляются по таймеру.
Проблема в том, что значения регистров eax и abx выводятся и обновляются нормально, а значения регистров ecx и edx постоянно равны 0. Подскажите пожалуйста, в чём может быть дело и как это устранить.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
05.12.2010, 21:35
Ответы с готовыми решениями:

Просмотр данных основных регистров в реальном времени
Необходимо чтобы программа выводила содержимое регистров в реальном времени, по таймеру например....

Вывод значений с com порта в TextBox и анализ на превышение лимита в реальном времени
На com порт поступают данные типа byte data, для удобства представлены в виде одной "партии"(в...

Вывод информации в реальном времени
Добрый день. Есть задача вывести на LCD дисплей HD44780 7 цифр. Цифры постоянно меняются...

Вывод данных в реальном времени
Здравствуйте. Подскажите как мне реализовать мою задумку. Хочу сделать динамический вывод...

7
22 / 22 / 2
Регистрация: 05.12.2010
Сообщений: 81
05.12.2010, 21:52 2
А что за asm то? NASM? FASM? TASM? MASM?
0
10 / 10 / 4
Регистрация: 06.05.2009
Сообщений: 34
05.12.2010, 21:54  [ТС] 3
Совсем забыл. Пишу в RadASM'е, а именно MASM
0
Ушел с форума
Автор FAQ
16279 / 7604 / 1065
Регистрация: 11.11.2010
Сообщений: 13,617
06.12.2010, 05:22 4
dimon_91, как то так
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
.686P
.model flat
include windows.inc
includelib user32.lib
extern _imp__MessageBoxA@16:dword
extern _imp__wsprintfA:dword
.code
start:  pushad
    mov ebp,esp
    xor eax,eax
    mov ax,ss
    push eax
    mov ax,gs
    push eax
    mov ax,fs
    push eax
    mov ax,es
    push eax
    mov ax,ds
    push eax
    mov ax,cs
    push eax
    push dword ptr [ebp+12];esp
    push dword ptr [ebp+8];ebp
    push dword ptr [ebp];edi
    push dword ptr [ebp+4];esi
    push dword ptr [ebp+20];edx
    push dword ptr [ebp+24];ecx
    push dword ptr [ebp+16];ebx
    push dword ptr [ebp+28];eax
    push offset format
    push offset buffer
    call _imp__wsprintfA
    add esp,64
    popad
    push 0
    push offset Caption
    push offset buffer 
    push 0
    call _imp__MessageBoxA@16
    retn
.data
format  db 'содержание регистров',0Ah,'при старте программы',0Ah
    db 'eax=%08lXh',0Ah
    db 'ebx=%08lXh',0Ah
    db 'ecx=%08lXh',0Ah
    db 'edx=%08lXh',0Ah
    db 'esi=%08lXh',0Ah
    db 'edi=%08lXh',0Ah
    db 'ebp=%08lXh',0Ah
    db 'esp=%08lXh',0Ah 
    db 'cs=%04lXh  ds=%04lXh',0Ah
    db 'es=%04lXh  fs=%04lXh',0Ah
    db 'gs=%04lXh  ss=%04lXh',0Ah,0
buffer db 250 dup (0)
Caption db 'debugger2',0
end start
1
10 / 10 / 4
Регистрация: 06.05.2009
Сообщений: 34
06.12.2010, 12:33  [ТС] 5
Это под какой ассемблер? У меня выдает следующие ошибки при сборке:
Test.obj : error LNK2001: unresolved external symbol _imp__MessageBoxA@16
Test.obj : error LNK2001: unresolved external symbol _imp__wsprintfA
LINK : error LNK2001: unresolved external symbol _start
Test.exe : fatal error LNK1120: 3 unresolved externals
0
Ушел с форума
Автор FAQ
16279 / 7604 / 1065
Регистрация: 11.11.2010
Сообщений: 13,617
06.12.2010, 13:04 6
dimon_91, это masm _imp__MessageBoxA@16 и _imp__wsprintfA находятся в user32.lib можешь посмотреть через поиск
0
10 / 10 / 4
Регистрация: 06.05.2009
Сообщений: 34
06.12.2010, 18:04  [ТС] 7
Да, спасибо! Ошибка была связана с RadASM'ом вылечил переустановкой.
0
10 / 10 / 4
Регистрация: 06.05.2009
Сообщений: 34
10.12.2010, 22:29  [ТС] 8
А как-нибудь можно выводить значения регистров процессора в ходе работы программы? Т.е. мне необходимо отслеживать, какие значения лежат в регистрах в данный момент времени (например по таймеру). Если делать так
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
...
.if eax==WM_INITDIALOG
        push    hWin
        pop     hWnd
        ........................
        ........................
        push edx
                push ecx
                push ebx
                push eax        
        call print
        pop eax
        pop ebx
        pop ecx
        pop edx
        
    .elseif eax==WM_TIMER
        .if wParam==timer
            invoke InvalidateRect, hWin,addr rect,TRUE
        .endif
    .elseif eax==WM_PAINT
            invoke BeginPaint,hWin, ADDR ps
                push edx
                push ecx
                push ebx
                push eax
            call print
            pop eax
            pop ebx
            pop ecx
            pop edx
                
            invoke EndPaint,hWin, ADDR ps
...
то программа будет показывать изменения только в eax. И эти изменения будет вносить сама программа. Подскажите пожалуйста, как можно узнать реальное состояние регистров?
0
10.12.2010, 22:29
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
10.12.2010, 22:29
Помогаю со студенческими работами здесь

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

Вывод графика в реальном времени
Всем привет! Мне необходимо вывести в реальном времени график ЭКГ/ЭЭГ сигнала, поступающего с...

Вывод графика в реальном времени
Всем привет, есть проблемка, не могу никак разобраться. Есть открытый сервер сокет, который...

Вывод информации в реальном времени
Здравствуйте. Спасибо вам что зашли! По ходу работы имею дело с очень, ну оооочень большим объемом...


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru