Форум программистов, компьютерный форум, киберфорум
Assembler: Windows/protected mode
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.55/11: Рейтинг темы: голосов - 11, средняя оценка - 4.55
0 / 0 / 2
Регистрация: 09.03.2015
Сообщений: 32

Получить версию ОС используя функцию DWORD GetVersion(VOID);

25.10.2016, 21:50. Показов 2043. Ответов 7
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Задание таково: Получить версию ОС используя функцию DWORD GetVersion(VOID);

Возвращаемое значение:
Ст. бит=0, мл. байт=4 — WinNT;
Ст. бит=0, мл. байт=5 — Win2000/XP;
Ст. бит=1, мл. байт=4 — Win95/98/ME;

Мой вариант программы таков, но он выдает не верный результат, видимо из-за неправильной организации проверки байтов, не могу понять, как правильно её сделать:

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
.386 ;тип процессора (i386 или старше) 
;использование защищенного режима 
.model flat,STDCALL ; модель памяти для Win32 
;Описание используемых внешних процедур Win32 API: 
 
extrn MessageBoxA:proc ;функция вывода сообщения 
extrn ExitProcess:proc ;функция завершения процесса 
extrn GetVersion:proc ;функция получения версии ОС 
 
.data ;сегмент данных 
title_1 db 'Version OS',0 ;заголовок окна 
message_1 db 'WinNT',0 ;текст сообщения 
message_2 db 'Win2000/XP',0 ;текст сообщения 
message_3 db 'Win95/98/ME',0 ;текст сообщения 
 
 
.code ;сегмент кода 
start: 
push 40h ;стиль окна - одна кнопка "OK" 
;и пиктограмма "i" 
 
call GetVersion ;вызов функции определения версии ОС 
test EAX,80000000h ;проверка старшего бита EAX 
jnz metka_3 ;если старший бит 1, переходим по metka_3 
and EAX,000000FFh ;обнуляем первые 3 байта 
test EAX,00000044h ; если младший байт 4 
je metka_1  ;переходим по metka_1 
push offset message_2   ;адрес строки с сообщением 
 
 
push offset title_1 ;адрес строки с заголовком 
metka_1: 
push offset message_1   ;адрес строки с сообщением 
metka_3: 
push offset message_3   ;адрес строки с сообщением 
 
 
push 0 ;дескриптор программы-владельца 
;создаваемого окна 
call MessageBoxA ;вызов функции вывода сообщения 
push 0 ;код завершения программы 
call ExitProcess ;вызов функции завершения программы 
end Start ;конец сегмента кода
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
25.10.2016, 21:50
Ответы с готовыми решениями:

Дважды вычислить значение выражения, используя функции возвращающие void и не void
Хай!Помогите решить Дважды вычислить значение выражения, используя функции возвращающие void и не void....

Найти факториал числа используя рекурсивною функции типа Void(), используя try and catch в main
Найти факториал числа используя рекурсивною функции типа Void(), используя try and catch в main. Люди,помогите!! Нельзя использовать...

Процедуры и функции: Используя функцию, получить значение f(t,0.3*s)+f(s,0.2*t)
Даны действительные числа s, t. Используя функцию, получить значение f(t,0.3*s)+f(s,0.2*t), вывод результата оформить в виде процедуры, где...

7
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
26.10.2016, 10:36
Вызови GetVersion, вытащи из EAX младший WORD.
Major Version = младший BYTE этого WORD-а,
Minor Version = старший BYTE этого WORD-а.
Все.

Для WinXP Major/Minor = 5.1
Для Win2K Major/Minor = 5.0
Для NT4 Major = 4

Старший бит EAX проверять не нужно.
0
0 / 0 / 2
Регистрация: 09.03.2015
Сообщений: 32
26.10.2016, 18:52  [ТС]
Убежденный, я не очень понял , я осуществил через major и minor на с++ , но на ассемблере32 просто не понимаю что нужно сделать
0
Asm/C++/Delphi/Py/PHP/VBA
 Аватар для Jin X
6808 / 2048 / 238
Регистрация: 14.12.2014
Сообщений: 4,297
Записей в блоге: 12
27.10.2016, 10:24
mylifemyrules, строка 26 - почему 44h, когда надо просто 4 (и можно не городить and+test (тем более, здесь надо не test, а cmp), а просто написать cmp al,4)?
И после push'ей надо делать переход на строку 38, иначе после первого пуша идёт второй, затем третий, когда нужен только один.
Соответственно, заголовок (строка 31) тоже переносится на строку 38.
0
0 / 0 / 2
Регистрация: 09.03.2015
Сообщений: 32
27.10.2016, 12:22  [ТС]
Jin X, я исправил, и теперь вообще не запускается окно
0
 Аватар для XiloManX
644 / 148 / 31
Регистрация: 11.02.2013
Сообщений: 277
27.10.2016, 21:04
mylifemyrules, держи на FASM (УГ/СГ компиляторами от Microsoft не пользуюсь). Набросал примерчик на скорую руку (100% рабочий). Ничего не оптимизировал.

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
;***************************************************************************;
;                            GetOSVersion                                   ;
;***************************************************************************;
;                                                                           ;
; Description:                                                              ;
;  The program receives the version of the operating system.                ;
;                                                                           ;
; Target OS:                                                                ;
;  Windows.                                                                 ;
;                                                                           ;
; The code was written by XiloManX.                                         ;
; Created specially for [url]https://www.cyberforum.ru[/url].                           ;
; Compile with FASM.                                                        ;
;                                                                           ;
; Rights of copying: is free.                                               ;
;                                                                           ;
;***************************************************************************;
 
crlf1 equ 13, 10        ; carette return and line feed.
crlf2 equ crlf1, crlf1  ; carette return and line feed (two times).
 
 include '%fasminc%/win32ax.inc'
 
.data
 
  osversion   db crlf1, 'Your OS Version is: '
  sizeof.osversion = $ - osversion
 
  win_xp      db 'WindowsXP.', crlf2  ; 5.1
  sizeof.win_xp = $ - win_xp
  win_eight   db 'Windows8.0 or WindowsServer2012.', crlf2    ; 6.2
  sizeof.win_eight = $ - win_eight
  win_eight1  db 'Windows8.1 or WindowsServer2012R2.', crlf2  ; 6.3
  sizeof.win_eight1 = $ - win_eight1
 
  err_message db "Error: I can't determine version of your operating sysrem!", crlf2
  sizeof.err_message = $ - err_message
 
  hStdIn      dd 0
  hStdOut     dd 0
  chrsRead    dd 0
  chrsWritten dd 0
  readBuf     db ?
 
.code
 
  start:
        invoke  AllocConsole
        invoke  GetStdHandle, STD_OUTPUT_HANDLE
    mov     [hStdOut], eax
        invoke  GetStdHandle,STD_INPUT_HANDLE
        mov     [hStdIn], eax
 
        ; output message.
        invoke  WriteConsoleA, [hStdOut], osversion, sizeof.osversion, chrsWritten, 0
 
        ; getting os version.
        invoke  GetVersion
 
        ; check for Windows XP.
        cmp     al, 5
        jne     chk_for_win_8
        cmp     ah, 1
        jne     chk_for_win_8
        invoke  WriteConsoleA, [hStdOut], win_xp, sizeof.win_xp, chrsWritten, 0
        jmp     exit
    chk_for_win_8:
        ; check for Windows 8.
        cmp     al, 6
        jne     chk_for_win_81
        cmp     ah, 2
        jne     chk_for_win_81
        invoke  WriteConsoleA, [hStdOut], win_eight, sizeof.win_eight, chrsWritten, 0
        jmp     exit
    chk_for_win_81:
        ; check for Windows 8.
        cmp     al, 6
        jne     print_err_message
        cmp     ah, 3
        jne     print_err_message
        invoke  WriteConsoleA, [hStdOut], win_eight1, sizeof.win_eight1, chrsWritten, 0
        jmp     exit
 
    print_err_message:
        invoke  WriteConsoleA, [hStdOut], err_message, sizeof.err_message, chrsWritten, 0
 
  exit:
        invoke  ReadConsoleA, [hStdIn], readBuf, 1, chrsRead, 0
        invoke  ExitProcess, 0
 
.end start
Изображения
 
Вложения
Тип файла: zip GetOSVersion.zip (33.5 Кб, 1 просмотров)
0
Asm/C++/Delphi/Py/PHP/VBA
 Аватар для Jin X
6808 / 2048 / 238
Регистрация: 14.12.2014
Сообщений: 4,297
Записей в блоге: 12
28.10.2016, 16:14
Лучший ответ Сообщение было отмечено mylifemyrules как решение

Решение

mylifemyrules, если исправил, тогда бы привёл результат.
Вот рабочий (без извращений и устаревших конструкций push/call):
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
.386 ;тип процессора (i386 или старше) 
;использование защищенного режима 
.model flat,stdcall ; модель памяти для Win32 
 
option casemap:none
 
include         kernel32.inc
include         user32.inc
includelib      kernel32.lib
includelib      user32.lib
 
.data ;сегмент данных
titleVer db 'Version OS',0 ;заголовок окна 
win95 db 'Windows 95/98/ME',0 ;старший бит=1
winNT db 'Windows NT',0 ;младший байт=4 и меньше
win2K db 'Windows 2000',0 ;младшее слово=5
winXP db 'Windows XP',0 ;младший байт=5, старший байт младшего слова<>0
winVista db 'Windows Vista',0 ;младшее слово=6
win7 db 'Windows 7',0 ;младшее слово=106h
win8 db 'Windows 8+',0 ;младшее слово=206h
 
.code ;сегмент кода 
start:
 
invoke GetVersion ;вызов функции определения версии ОС 
 
mov ebx,offset win95 ;заранее выставляем адрес строки
test eax,80000000h ;проверка старшего бита EAX 
jnz @msgbox ;если старший бит 1, переходим по @msgbox
 
mov ebx,offset winNT ;заранее выставляем адрес строки
cmp al,4 ;если младший байт 4 или меньше
jbe @msgbox ;переходим по @msgbox
 
mov ebx,offset win2K ;заранее выставляем адрес строки...
cmp ax,5
je @msgbox
 
mov ebx,offset winXP
cmp al,5 ;ah<>0, т.к. мы уже это проверяли чуть выше
je @msgbox
 
mov ebx,offset winVista
cmp ax,6
je @msgbox
 
mov ebx,offset win7
cmp ax,106h
je @msgbox
 
mov ebx,offset win8
@msgbox:
invoke MessageBox, 0, ebx, offset titleVer, 40h ;вызов функции вывода сообщения (40h = стиль окна: одна кнопка "OK" и пиктограмма "i")
 
invoke ExitProcess, 0 ;вызов функции завершения программы 
 
end start ;конец сегмента кода
Добавлено через 16 часов 3 минуты
Версия для TASM32:
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
.386 ;тип процессора (i386 или старше) 
;использование защищенного режима 
.model flat,stdcall ; модель памяти для Win32 
 
extrn MessageBoxA:proc ;функция вывода сообщения 
extrn ExitProcess:proc ;функция завершения процесса 
extrn GetVersion:proc ;функция получения версии ОС
 
.data ;сегмент данных
titleVer db 'Version OS',0 ;заголовок окна 
win95 db 'Windows 95/98/ME',0 ;старший бит=1
winNT db 'Windows NT',0 ;младший байт=4 и меньше
win2K db 'Windows 2000',0 ;младшее слово=5
winXP db 'Windows XP',0 ;младший байт=5, старший байт младшего слова<>0
winVista db 'Windows Vista',0 ;младшее слово=6
win7 db 'Windows 7',0 ;младшее слово=106h
win8 db 'Windows 8+',0 ;младшее слово=206h
 
.code ;сегмент кода 
start:
 
call GetVersion ;вызов функции определения версии ОС 
 
mov ebx,offset win95 ;заранее выставляем адрес строки
test eax,80000000h ;проверка старшего бита EAX 
jnz @msgbox ;если старший бит 1, переходим по @msgbox
 
mov ebx,offset winNT ;заранее выставляем адрес строки
cmp al,4 ;если младший байт 4 или меньше
jbe @msgbox ;переходим по @msgbox
 
mov ebx,offset win2K ;заранее выставляем адрес строки...
cmp ax,5
je @msgbox
 
mov ebx,offset winXP
cmp al,5 ;ah<>0, т.к. мы уже это проверяли чуть выше
je @msgbox
 
mov ebx,offset winVista
cmp ax,6
je @msgbox
 
mov ebx,offset win7
cmp ax,106h
je @msgbox
 
mov ebx,offset win8
@msgbox:
call MessageBoxA, 0, ebx, offset titleVer, 40h ;вызов функции вывода сообщения (40h = стиль окна: одна кнопка "OK" и пиктограмма "i")
 
call ExitProcess, 0 ;вызов функции завершения программы 
 
end start ;конец сегмента кода
1
0 / 0 / 2
Регистрация: 09.03.2015
Сообщений: 32
29.10.2016, 23:33  [ТС]
Jin X, Спасибо огромное, то что надо, просто спас меня) а то я запутался в ней конкретно))
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
29.10.2016, 23:33
Помогаю со студенческими работами здесь

Получить настройки прокси-сервера, используя функцию WinHttpGetProxyForUrl
Пожалуйста, помогите получить настройки прокси-сервера используя функцию WinHttpGetProxyForUrl из WinHttp.dll. &quot;Вариант решения&quot;...

Получить из файла все цифры, используя функцию fstream
Мужики помогите, препод задал написать прогу и чтобы она брала значения с текстового документа с помощью fstream. Не могу понять, как она...

Получить координаты мышки на форме, используя api функцию
Задание дали, получать координаты мышки на форме, используя api функцию в нэте нашёл 6.0 код, переделал что мог на 10,но не работает ...

System.Void из C# использоваться не может - для получения объекта типа void используйте typeof (void)
Изучаю с# по &quot;Шилдт Г. - C# 4.0 полное руководство&quot; При изучении конструктора возникла проблема: попытался запустить код на стр. 169, а...

Получить из исходного списка (A ((B) (C)) (D) (K) L) элемент списков (A B C) (A (D) (C)) (D A B) используя функцию cons
Здравствуйте Помогите пожалуйста с задачей: Получить из исходного списка (A ((B) (C)) (D) (K) L) элемент списков (A B C) (A...


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
Новый ноутбук
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