Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 03.11.2022, 19:41   #1
mikado3333
Пользователь
 
Регистрация: 25.09.2013
Сообщений: 58
По умолчанию На понимание: описание строк внутри процедуры

Приветствую. В 86 windows часто использовал описание строк в процедурах.
Удобно все нужные строки в процедуре и искать их среди "section '.text'" не нужно.
А вот с 64 windows не проходит такой фокус. Получаю ошибку 998 - "Неверная попытка доступа к адресу памяти."

Код:

format PE64 GUI 5.0
entry start
 
include 'win64w.inc'
include 'encoding\UTF8.INC' 
 
section '.data' data readable writeable
 
  _title TCHAR 'Win64 program template',0
  _good TCHAR 'Startup good.',0
  _format   du 'Код ошибки: %u',0 
testBuf rb 40000
 
 
section '.text' code readable executable
 
  start:
    sub rsp,8       
    stdcall seeMess, _title
    invoke  MessageBox,NULL,_good,NULL,MB_ICONERROR+MB_OK
    invoke  ExitProcess,0
    
error:
    invoke  GetLastError
    invoke  wsprintf, testBuf, _format, rax
    invoke  MessageBox, 0, testBuf, _title, MB_OK
    invoke  ExitProcess,0
 
 
proc seeMess text                                                                                   ; Аналог messagebox
locals
win     dq ?
nops    dq ?
nops1   dq ?
endl
    mov     [text], rcx
    ;xor     rax, rax
    
 
    invoke  CreateWindowExW, 0, .class11 , .title11, WS_VISIBLE+WS_OVERLAPPEDWINDOW+\
                             ES_AUTOVSCROLL+ES_READONLY+ES_MULTILINE+WS_VSCROLL,25, 50, 550, 200,\ 
                             0, 0, 0,0  
    mov     [win], rax
    cmp rax, 0
    jz error
    ret
 
    
    .class11: du "Edit", 0
    .title11: du "Информация",0
    
 
endp
 
 
section '.idata' import data readable writeable
 
  library kernel32,'KERNEL32.DLL',\
      user32,'USER32.DLL'
 
  include 'api\kernel32.inc'
  include 'api\user32.inc'
Если раскомментировать ;xor rax, rax то CreateWindowEx не выдает ошибки.
Получается на результат влияет какое количество команд прошло до вызова CreateWindowEx.
Если четное, то работает. Если не четное то ошибка.
Может у кого нибудь есть понимание почему так происходит?
mikado3333 вне форума Ответить с цитированием
Старый 03.11.2022, 19:48   #2
macomics
Участник клуба
 
Регистрация: 17.04.2022
Сообщений: 1,833
По умолчанию

Для загрузки указателей на строки при вызове используйте слово addr.
Код:
    invoke  CreateWindowExW, 0, addr .class11 , addr .title11, WS_VISIBLE+WS_OVERLAPPEDWINDOW+\
                             ES_AUTOVSCROLL+ES_READONLY+ES_MULTILINE+WS_VSCROLL,25, 50, 550, 200,\ 
                             0, 0, 0,0
macomics вне форума Ответить с цитированием
Старый 03.11.2022, 20:07   #3
mikado3333
Пользователь
 
Регистрация: 25.09.2013
Сообщений: 58
По умолчанию

Цитата:
Сообщение от macomics Посмотреть сообщение
Для загрузки указателей на строки при вызове используйте слово addr.
Код:
    invoke  CreateWindowExW, 0, addr .class11 , addr .title11, WS_VISIBLE+WS_OVERLAPPEDWINDOW+\
                             ES_AUTOVSCROLL+ES_READONLY+ES_MULTILINE+WS_VSCROLL,25, 50, 550, 200,\ 
                             0, 0, 0,0
Не помогло, получаю ошибку 998
mikado3333 вне форума Ответить с цитированием
Старый 03.11.2022, 20:38   #4
macomics
Участник клуба
 
Регистрация: 17.04.2022
Сообщений: 1,833
По умолчанию

Судя по дизассемблеру все в порядке. Это вам надо код проверять на логические ошибки
Код:
  40b0c3:	55                   	push   %rbp
  40b0c4:	48 89 e5             	mov    %rsp,%rbp
  40b0c7:	48 83 ec 20          	sub    $0x20,%rsp
  40b0cb:	48 89 4d 10          	mov    %rcx,0x10(%rbp)
  40b0cf:	48 83 ec 60          	sub    $0x60,%rsp
  40b0d3:	48 c7 c1 00 00 00 00 	mov    $0x0,%rcx
  40b0da:	48 8d 15 70 00 00 00 	lea    0x70(%rip),%rdx        # 0x40b151 = addr .class11
  40b0e1:	4c 8d 05 73 00 00 00 	lea    0x73(%rip),%r8        # 0x40b15b = addr .title11
  40b0e8:	49 c7 c1 44 08 ef 10 	mov    $0x10ef0844,%r9
  40b0ef:	48 c7 44 24 20 19 00 00 00 	movq   $0x19,0x20(%rsp)
  40b0f8:	48 c7 44 24 28 32 00 00 00 	movq   $0x32,0x28(%rsp)
  40b101:	48 c7 44 24 30 26 02 00 00 	movq   $0x226,0x30(%rsp)
  40b10a:	48 c7 44 24 38 c8 00 00 00 	movq   $0xc8,0x38(%rsp)
  40b113:	48 c7 44 24 40 00 00 00 00 	movq   $0x0,0x40(%rsp)
  40b11c:	48 c7 44 24 48 00 00 00 00 	movq   $0x0,0x48(%rsp)
  40b125:	48 c7 44 24 50 00 00 00 00 	movq   $0x0,0x50(%rsp)
  40b12e:	48 c7 44 24 58 00 00 00 00 	movq   $0x0,0x58(%rsp)
  40b137:	ff 15 8b 0f 00 00    	callq  *0xf8b(%rip)        # 0x40c0c8
  40b13d:	48 83 c4 60          	add    $0x60,%rsp
  40b141:	48 89 45 e0          	mov    %rax,-0x20(%rbp)
  40b145:	48 83 f8 00          	cmp    $0x0,%rax
  40b149:	0f 84 08 ff ff ff    	je     0x40b057
  40b14f:	c9                   	leaveq 
  40b150:	c3                   	retq
  40b151: db 'Edit', 0
  40b15b: db 'Информация', 0
Судя по коду ошибки вам стоит убрать include 'encoding/UTF8.inc'

Последний раз редактировалось macomics; 03.11.2022 в 20:41.
macomics вне форума Ответить с цитированием
Старый 03.11.2022, 21:11   #5
mikado3333
Пользователь
 
Регистрация: 25.09.2013
Сообщений: 58
По умолчанию

Цитата:
Сообщение от macomics Посмотреть сообщение
Судя по коду ошибки вам стоит убрать include 'encoding/UTF8.inc'
Мимо .

Цитата:
Сообщение от macomics Посмотреть сообщение
Это вам надо код проверять на логические ошибки
Согласен что где то логическая ошибка, только я ни как не могу ее найти.
mikado3333 вне форума Ответить с цитированием
Старый 03.11.2022, 21:24   #6
macomics
Участник клуба
 
Регистрация: 17.04.2022
Сообщений: 1,833
По умолчанию

Тогда давайте разбираться с параметрами. Почему у вас передается 0 в качестве hInstance (предпоследний параметр)?

Он обязательно должен быть равен базовому адресу загрузки вашего модуля в память. Его можно получить через invoke GetModuleHandle, NULL или посчитать вручную.

Последний раз редактировалось macomics; 03.11.2022 в 21:31.
macomics вне форума Ответить с цитированием
Старый 03.11.2022, 22:08   #7
mikado3333
Пользователь
 
Регистрация: 25.09.2013
Сообщений: 58
По умолчанию

Опять мимо.

Помогла директива align 16

Код:
proc seeMess text                                                                                   ; Аналог messagebox
locals
win     dq ?
nops    dq ?
nops1   dq ?
endl
    mov     [text], rcx
    xor     rax, rax
   
	invoke	GetModuleHandle, 0	
 
    invoke  CreateWindowExW, 0, addr .class11 , addr .title11, WS_VISIBLE+WS_OVERLAPPEDWINDOW+\
                             ES_AUTOVSCROLL+ES_READONLY+ES_MULTILINE+WS_VSCROLL,25, 50, 550, 200,\ 
                             0, 0, rax,0  
    mov     [win], rax
    cmp rax, 0
    jz error
    ret

   align 16
    .class11: du "Edit", 0
    .title11: du "Информация",0
    
 
endp
Не понятно почему в секции кода необходимо выравнивать, а при чтении в секции данных нет?
mikado3333 вне форума Ответить с цитированием
Старый 03.11.2022, 22:32   #8
macomics
Участник клуба
 
Регистрация: 17.04.2022
Сообщений: 1,833
По умолчанию

А вот это я не обратил внимания. Действительно типы данных в Windows должны в памяти быть выровнены на свою длину. В данном случае у вас du занимает 2 байта и должна быть выровнена на 2 (даже не на 16).
Для переменных типа DWORD/int/dd выравнивание должно быть на 4 байта, а для QWORD/dq - 8 байт и т.п.

Могу порекомендовать такую структуру для строк
Код:
struc STRA txt& { label . byte
 db txt
 .Length = $ - .
 db NULL
 .Bytes = $ - . }

struc STRU txt& { if $ and 1
  db NULL
 end if
 label . word
 du txt
 .Length = ( $ - . ) shr 1
 dw NULL
 .Bytes = $ - . }

; Использование
; Name0 STRA "Привет", ' ', "мир!"
; Name1 STRU "Абракадабра"
; mov rax, Name0.Length
; mov ecx, Name1.Bytes
Она определяет строку без необходимости завершать ее 0 и одновременно определяет ее длину в символах и байтах

Последний раз редактировалось macomics; 03.11.2022 в 22:40.
macomics вне форума Ответить с цитированием
Старый 04.11.2022, 00:18   #9
mikado3333
Пользователь
 
Регистрация: 25.09.2013
Сообщений: 58
По умолчанию

Цитата:
Сообщение от macomics Посмотреть сообщение
Действительно типы данных в Windows должны в памяти быть выровнены на свою длину. В данном случае у вас du занимает 2 байта и должна быть выровнена на 2
Я так понимаю к секции данных это не относится? Там может быть различный набор директив db, du, rb.
Код:
                                                                                        section '.data' data readable writeable
00000200:                          00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00      testBuf rb 39999 
                                   00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00      
                                   00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00      
 ..................................................................................................   
                                   00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00      
                                   00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00      
                                   00 00 00 00 00 00 00 00 00 00 00 00 00 00 00         
00009E3F: [000000000040AC3F]       57 00 69 00 6E 00 36 00 34 00 20 00 70 00 72 00        _title TCHAR 'Win64 program template',0
                                   6F 00 67 00 72 00 61 00 6D 00 20 00 74 00 65 00      
                                   6D 00 70 00 6C 00 61 00 74 00 65 00 00 00            
00009E6D: [000000000040AC6D]       53 00 74 00 61 00 72 00 74 00 75 00 70 00 20 00        _good TCHAR 'Startup good.',0
                                   67 00 6F 00 6F 00 64 00 2E 00 00 00                  
00009E89: [000000000040AC89]       1A 04 3E 04 34 04 20 00 3E 04 48 04 38 04 31 04        _format   du 'Код ошибки: %u',0 
                                   3A 04 38 04 3A 00 20 00 25 00 75 00 00 00            
                                                                                        
                                                                                         
                                                                                         
00009EA7: [000000000040ACA7]       00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00      section '.text' code readable executable
                                   00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00      
                                   00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00      
                                   00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00      
                                   00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00      
                                   00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00      
                                   00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00      
                                   00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00      
                                   00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00      
                                   00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00      
                                   00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00      
                                   00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00      
                                   00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00      
                                   00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00      
                                   00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00      
                                   00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00      
                                   00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00      
                                   00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00      
                                   00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00      
                                   00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00      
                                   00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00      
                                   00 00 00 00 00 00 00 00 00                           
                                                                                         
          [000000000040B000]                                                              start:
0000A000:                          48 83 EC 08                                              sub rsp,8
Цитата:
Сообщение от macomics Посмотреть сообщение
Для переменных типа DWORD/int/dd выравнивание должно быть на 4 байта, а для QWORD/dq - 8 байт и т.п.
Если я правильно понимаю, то для секции кода верно следующее:
а) функция (CreateWindowExW) ожидает строку Юникод,
то данная строка должна находиться по адресу кратному 2 ;
б) функция ожидает параметр в 8 байт, то данный параметр если он лежит
в секции кода должен находиться по адресу кратному 8, а не 2. Но у меня сработала с 2

Код:
proc seeMess text                                                                                   ; Аналог messagebox
locals
win     dq ?
nops    dq ?
nops1   dq ?
endl
    mov     [text], rcx
    xor     rax, rax
   
	invoke	GetModuleHandle, 0	
 
    invoke  CreateWindowExW, 0, .class11 ,  .title11, WS_VISIBLE+WS_OVERLAPPEDWINDOW+\
                             ES_AUTOVSCROLL+ES_READONLY+ES_MULTILINE+WS_VSCROLL,25, 50, 550, 200,\ 
                             qword[.jjjs], 0, rax,0  
    mov     [win], rax
    cmp rax, 0
    jz error
    ret

   align 2
	.jjjs:	dq 0
	.jjjsd:	dd 1
    .class11: du "Edit", 0
    .title11: du "Информация",0
    
 
endp
mikado3333 вне форума Ответить с цитированием
Старый 04.11.2022, 00:43   #10
mikado3333
Пользователь
 
Регистрация: 25.09.2013
Сообщений: 58
По умолчанию

Снимаю свой вопрос про секцию данных. К ней тоже относится правило выравнивания.
выполнив следующий код
Код:

section '.data' data readable writeable
 testBuf rb 39999  
  _title TCHAR 'Win64 program template',0
  _good TCHAR 'Startup good.',0
  _format   du 'Код ошибки: %u',0 

class11 du "Edit", 0
title11 du "Информация",0

...................................
proc seeMess text                                                                                   ; Аналог messagebox
locals
win     dq ?
nops    dq ?
nops1   dq ?
endl
    mov     [text], rcx
    xor     rax, rax
   
	invoke	GetModuleHandle, 0	
 
    invoke  CreateWindowExW, 0, class11 ,  title11, WS_VISIBLE+WS_OVERLAPPEDWINDOW+\
                             ES_AUTOVSCROLL+ES_READONLY+ES_MULTILINE+WS_VSCROLL,25, 50, 550, 200,\ 
                            qword[.j], 0, rax,0  
    mov     [win], rax
    cmp rax, 0
    jz error
    ret
	
	.t: db 0
	.j: dq 0
endp
работать не будет из за testBuf rb 39999. Исправив 39999-> 40000 все работает.

Вывод такой: проблемы возникают только со строками Юникод. Их адрес всегда должен быть кратен 2.
С числами проблем нет (qword[.j]).
Если не прав скорректируйте пожалуйста.
mikado3333 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Есть Программа описание внутри PAREN_DEFO Фриланс 5 09.05.2013 14:36
Задача(Описание внутри) airesjke Помощь студентам 3 02.05.2013 15:13
Проблема с компьютером (описание внутри) seragem Помощь студентам 4 07.06.2011 08:57
Описание внутри HoBuHKuй Помощь студентам 1 02.06.2010 14:16
Глюк(описание внутри) Stellvertreter Общие вопросы C/C++ 6 16.10.2008 19:31