Я так и делал Код (Text): write_con proc push ebx push ecx mov ebx,offset str_out_txt mov ecx,len_str_out_txt invoke WriteConsole,out_hndl,ebx,ecx,ch_write_con,0 pop ecx pop ebx Ret write_con EndP Код (Text): Read_con proc invoke ReadConsole,in_hndl,offset buf_for_read,len_buf_for_read,ch_read_con,0; Ret read_con EndP Я не понимаю почему так ассемблируется, да и происходит так только с малыми числами, а с четырехзначными всё в порядке. Вот файл. В Х = -8000б в У = 5500, ответ -2500 как и положено. Тип у них и у Z DWORD. В вводе, выводе и форматировании используются адреса на строку BATE. Почему не выходит на консоль арифметический ответ с участием 1х, 2х, 3х-значными числами, а 4х-значными выходит.
Здравствуйте! Прошу подсказать где у меня ошибка. Сижу над этим кодом довольно долго. Вылезает вместо 1 2 3 4 такое в мессадже: 1 131072 0 3 Код (Text): .386 .model flat,stdcall include C:\masm32\INCLUDE\WINDOWS.INC include C:\masm32\INCLUDE\KERNEL32.INC include C:\masm32\INCLUDE\USER32.INC include C:\masm32\INCLUDE\ADVAPI32.INC include C:\masm32\INCLUDE\GDI32.INC includelib C:\masm32\lib\comctl32.lib includelib C:\masm32\lib\user32.lib includelib C:\masm32\lib\gdi32.lib includelib C:\masm32\lib\kernel32.lib includelib C:\masm32\lib\user32.lib includelib C:\masm32\lib\advapi32.lib .data NAME_ db "Первый файл",0 ;имя файла fg DWORD ? ;адрес куда функция WriteFile занесет кол-во символов в строке we dword ? ; Дескриптор файла buff db 100 dup(0) ;буфер, куда помещается содержимое файла buff1 db 100 dup(0) ;Буфер для функции wsprintf srtt db "%d %d %d %d",0 g1 db ? g2 db ? g3 db ? g4 db ? ;,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, .code ;,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, START: invoke CreateFile,addr NAME_,GENERIC_READ,0,0,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0 ;читаем файл mov we,eax ; сохраняем его дескриптор в переменной invoke ReadFile,we,addr buff,4,addr fg,0 mov ebx,offset buff mov ah,byte ptr [ebx] mov g1,ah mov ah,byte ptr [ebx+1] mov g2,ah mov ah,byte ptr [ebx+2] mov g3,ah mov ah,byte ptr [ebx+3] mov g4,ah invoke wsprintf,addr buff1,addr srtt,g1,g2,g3,g4 invoke MessageBox,0,addr buff1,addr NAME_,0 invoke CloseHandle,we ; освобождаем дескриптор(равноченно закрытию файла) invoke ExitProcess ,0 ;выходим из программы end START
Код (Text): ;mov ebx,offset buff ;mov ah,byte ptr [ebx] ;mov g1,ah ;mov ah,byte ptr [ebx+1] ;mov g2,ah ;mov ah,byte ptr [ebx+2] ;mov g3,ah ;mov ah,byte ptr [ebx+3] ;mov g4,ah mov eax,[buf] mov [g1],eax invoke wsprintf,addr buff1,addr srtt,g1,g2,g3,g4 g1..g4 не dword'ы, а байты, итак имеем: dword[g1+3] = $01xxxxxx dword[g1+2] = $0201xxxx dword[g1+1] = $030201xx dword[g1+0] = $04030201 addr srtt addr buff1
dword[g1+3] = $01xxxxxx dword[g1+2] = $0201xxxx dword[g1+1] = $030201xx dword[g1+0] = $04030201 запутал: dword[g1+3] = $xxxxxx04 dword[g1+2] = $xxxx0403 dword[g1+1] = $xx040302 dword[g1+0] = $04030201
Благодарю еще раз, я уже понял по первой вашей подсказке. После того как вы мне описали, я просто заменил в области данных: Код (Text): g1 db ? g2 db ? g3 db ? g4 db ? На это: Код (Text): g1 dd 01 g2 dd 02 g3 dd 03 g4 dd 04 И все стало понятно сразу. Я загонял в функцию неправильный тип данных. Кстати тему случайно выбрал из поиска по функции wsprintf и она как раз оказалась правильной для моего вопроса.
Mars еще раз перечитайте мой пост. вы делаете не так. write_con proc push ebx push ecx mov ebx,offset str_out_txt mov ecx,len_str_out_txt invoke WriteConsole,out_hndl,ebx,ecx,ch_write_con,0 pop ecx pop ebx Ret write_con EndP вместо смещения передаете значение из переменной!