Просмотр полной версии : [ASSEMBLER] Задаем вопросы (для новичков)
!_filin_!
25.05.2007, 17:31
надо в меседжбоксе вывести содержание переменной, как реализовать?
Great: В этой теме задаем простые вопросы по ассемблеру (специально для новичков)
Элементарно:
...
.data
msgtext db "Hello, WORLD", 0h
msgcap db "It is ASM!!! =)", 0h
...
.code
start:
INVOKE MessageBoxA, 0 offset msgtext, offset msgcap, 0
end start
!_filin_!
25.05.2007, 18:00
гг..ты немного...а точнее совсем нетак понял. Значение в переменную заносится во время работы проги, например я от функции получаю число. и его надо вывести на месседж бокс вот примерный код:
...................
.data
msgtext db "Hello, WORLD", 0h
msgcap db "It is ASM!!! =)", 0h
messedg db ?
...............
code
start:
mov messedg, 15
INVOKE MessageBoxA, 0 offset msgtext, offset msgcap, 0
end start
Использовал вместо функции MOV, соответственно как на месседж бокс вывести содержание переменной messedg (число 15)
а сзади дописать 0h у messedg? так сказать привести строку к ASCIIZ виду
Просто так вывести нельзя. так число - это не строка.
Поэтому нужно перевести из числа в строку. Можно сделать это вручную, но лучше юзать API функцию.
Вот код на FASM. Выводит содержимое регистра.
format PE GUI
entry _start
include 'd:\coding\fasm\include\win32ax.inc'
include 'd:\coding\fasm\include\encoding\win1251.inc'
include 'd:\coding\fasm\include\apia\user32.inc'
section '.data' data readable writeable
formats db "%d",0
zagolovok db "Содержимое регистра",0
temp db 256 dup(?)
section '.code' code readable executable
_start:
mov eax,-1234568
invoke wsprintf,temp,formats,eax
invoke MessageBox,0,temp,zagolovok,MB_OK
invoke ExitProcess,0
section '.idata' import data readable writeable
library kernel32,'KERNEL32.DLL',user32,'USER32.DLL'
include 'd:\coding\fasm\include\apia\kernel32.inc'
Решил тоже ассемблер поизучать.
Пишется таким способом тяжело, зато инжектится в чужой процесс элементарно.
IMНO зачем тогда ассемблер нужен.
INVOKE wvsprintf,offset outst,offset inst,var1,var2, .....
h ttp://msdn2.microsoft.com/en-us/library/ms647551.aspx
Преобразует содержание переменной(ых) в строку.
.486
.model flat,stdcall
option casemap :none
kernel32 EQU edx
user32 EQU ebx
CallFunc MACRO reg,zText:VARARG
LOCAL m1
call m1
db zText,0
m1:
push reg
call ebp
call eax
ENDM
cText MACRO zText:VARARG
LOCAL m1
call m1
db zText,0
m1:
ENDM
;----------------------------------------------
.code
start:
mov edx,[esp]
call sfind_kern_b
; edx kernel32.dll ModuleHandle
; ebx User32.dll ModuleHandle
; ebp = GetProcAddress(GetModuleHandle('kernel32.dll),'Get ProcAddress');
push kernel32 ;--1
cText 'user32.dll'
CallFunc kernel32,'LoadLibraryA'
mov user32,eax
pop kernel32 ;--1
;--------------------------------------------------
CallFunc kernel32,'GetCurrentProcessId'
;--------------------------------------------------
; INVOKE wvsprintf,offset outst,offset inst,var1,var2, .....
; http://msdn2.microsoft.com/en-us/library/ms647551.aspx
;-------------------
mov ecx,10
m1: push 0
loop m1 ;10*4+
mov ecx,esp ;offset outst
push ebp ;--1
push ebx ;--2
push eax ;ProcessId var1
push esp ;var1
cText 'It is MASM!!! =)%#8IX',0 ;//offset inst
push ecx ;offset outst
CallFunc user32,'wvsprintfA'
add esp,4 ; var1 dellete
pop ebx ;--2
pop ebp ;--1
mov ecx,esp ;offset outst
;---------------------------------------------------
;-- MessageBox ----------------------------------
push 0
cText 'ProcessId'
push ecx ;offset outst
push 0
CallFunc user32,'MessageBoxA'
add esp,10*4 ;10*4-
ret ; exit proocess
;-------------------------------------------
;-- No comments -- Не отлажено ------
sfind_kern_b: ;edx base
sfind_kern_bs:
and edx,0ffff0000h
cmp word ptr [edx],05A4Dh
jz sfind_kern_b1
sub edx,1000h
jmp sfind_kern_bs
sfind_kern_b1:
mov eax,[edx+3ch]
mov ebx,edx
add ebx,eax
cmp word ptr[ebx],04550h
jz sfind_kern_b2
sub edx,1000h
jmp sfind_kern_bs
GPA db 'GetProcAddress',0
sfind_kern_b2:
mov esi,offset GPA
mov ebx,EDX
add ebx,03Ch
mov eax,[ebx]
mov ebx,EDX
add ebx,eax
add ebx,160h-0e8h
mov ecx,EDX
add ecx,[ebx]
add ecx,12 ; adr export
mov ebx,EDX
add ebx,[ecx]
mov edi,ebx
xor eax,eax
sadrxor:
push edi
push esi
sgpa_fefe:
pop edi
pop esi
inc esi
push esi
push edi
mov ecx,0Fh
repe cmpsb
cmp ecx,0
jz sgpa_fef
mov cl,0
cmp [esi],cl
jnz sgpa_fefe
inc eax
jmp sgpa_fefe
sgpa_fef:
pop edi
pop esi
push eax
mov ebx,EDX
add ebx,03Ch
mov eax,[ebx]
mov ebx,EDX
add ebx,eax
add ebx,160h-0e8h
mov ecx,EDX
add ecx,[ebx]
pop ebx
dec ebx
MOV EAX,[ECX+24h]
add eax,edx
MOV bx,[eax+ebx*2]
MOV EAX,[ECX+1ch]
add eax,edx
MOV EAX,[eax+ebx*4]
add eax,edx
mov ebp,eax
ret
end start
Как бы все это попроще писать?
Особенно переменные в стеке. :confused:
Мне нужна таблица системных вызовов линукс, чтобы с регистрами и все дела =\
Есть у кого?
Тискаем гугл (http://www.google.ru/search?hl=ru&q=linux+syscalls&btnG=%D0%9F%D0%BE%D0%B8%D1%81%D0%BA+%D0%B2+Google&lr=)
второй линк: http://www.die.net/doc/linux/man/man2/syscalls.2.html
читай-не хочу
2 da_ff. Типа сумничал?
Можно и сделать деление, но это только в тех случаях когда пишешь под DOS. потому что там нет API функций. Если нужно под дос, то могу выложить примерчик!
О! крута.... ну раз такой сабж забили, то посоветуйте книги/статьи попроще, ибо я ваще в этом не шарю
О! крута.... ну раз такой сабж забили, то посоветуйте книги/статьи попроще, ибо я ваще в этом не шарю
В.Юров учебник+справочник, калашникова рекомендуют (не читал)
ЗЫ. Зубкова еще рекомендуют, сам не читал )
ЗЫЫ. Вообще, моё имхо, рано или поздно по любой книге можно выучить асм. Точнее, не по одной, а если купить несколько книг, мозг в конце концов научится отфильровывать ненужное.
Dumkopff
27.05.2007, 18:43
-n00by-
Iczelion tutorials
все очень понятно написано имхо.
!_filin_!
27.05.2007, 18:55
Какраз Икзелиона туторы для начала будут сложные.
Лутше начинай с Калаша, потом Самоучитель Ассемблер IBM PC (Галисеева) ну и под конец Assembler для DOS, Win , Unix (Зубкова)
Как по мне это три основные книжки, от Калаша узнаеш вообще что такое асм там всё очень доходчиво описано, Самоучитель - это уже следуйщий уровень, описана работа под Вынем и некоторые интересные алгоритмы, Зубков - это классика тут уже высший уровень. Линки не давал потому что у меня эти книжки в печатном варианте.
Назвал основу но конечно чем больше инфы прочитаеш ( и запомниш! ) тем лутше для тебя (Тот же Икзелион). Так что гугл тебе в руки, сейчас литературы очень много!
Берешь список инструкций МП и этого уже будет достаточно.
Ну и как всегда Справочник по Api функциям и прерываниям Dos
L0rd_Ha0S
28.05.2007, 19:00
To -n00by-:
Вот сюда (http://wasm.ru/) зайди, тут много чего интересного есть.
как компилировать *.asm сорцы в masm'e?
и во что они должны скомпилиться, в exe или в com?
Во что компилить - это уже во что захочешь. т.е. есть опции для компиляции, также внутри файла есть маханькие описания. типа если файл создает из сегмента кода, данныйх итд, то никогда ты его не скомпилишь в ком файл.
Вроде масм компилит по умолчанию в EXE.
Для того чтобы компильнуть под COM нужно делать так:
ml.exe [имя_файла].asm /AT
как компилировать *.asm сорцы в masm'e?
мой любимый способ:
создаешь example.bat туды пишешь
;@echo off
;goto make
.386
.model flat,stdcall
option casemap:none
include D:\masm32\include\windows.inc
include D:\masm32\include\user32.inc
include D:\masm32\include\kernel32.inc
includelib D:\masm32\lib\kernel32.lib
includelib D:\masm32\lib\user32.lib
.data
s_title db "Хэкк",0
s_zzz db "хэккерский хэккк",0
.code
start:
invoke MessageBox,0,addr s_zzz,addr s_title,0
invoke ExitProcess,0
end start
:make
set asmname=D:\example
title %asmname%.bat
D:\masm32\bin\ml /c /coff %asmname%.bat
D:\masm32\bin\link /SUBSYSTEM:WINDOWS /LIBPATH:D:\masm32\lib %asmname%.obj
del %asmname%.obj
echo
pause
запускаешь батник >>> .exe готов!!
и во что они должны скомпилиться, в exe или в com?
что компилятору и линкеру скажешь, то он и сделает.. (.exe .com .dll .sys .....)
на wasm.ru кажется были опции
А не проще ли юзать какую-нибудь IDE? RadASM или WinASM, например?
как компилировать *.asm сорцы в masm'e?
Командами:
ml /c /coff /Cp *.asm
link /SUBSYSTEM:CONSOLE *.obj
Флаги различны в зависимости от того, что на выходе хочешь. Навскидку что обозначают к сожалению уже не помню - смотри на wasm.ru
мой любимый способ:
создаешь example.bat туды пишешь
...
Оу, что-то не понял прикола, прошу пояснений. Твой способ у меня не сработал к сожалению. =)
А не проще ли юзать какую-нибудь IDE? RadASM или WinASM, например?
Да ну, имхо фигня эти все ide для асма. Максимум нужны только в крупных проектах, чтоб не запутаться.
Эх.. Fasm Rulit - нету мозгоебки с компилом
ml.exe [имя_файла].asm /AT
чуть попозже выложу текст ошибки, которую масм выдает при таком способе=\
Эх.. Fasm Rulit - нету мозгоебки с компилом
возможно, но я уже купил книжку Калашникова, а она про masm. хотел в электронной версии прочитать, но решил купить.
еще вопрос: в каком случае надо компилить в com, а в каком в exe?
+еще один: зачем нужны файлы в расширении *.obj?
Спасибо!=)
После ассемблирования (с помощью ml) исходник превращается в промежуточную форму - объектный модуль (.obj). Для генерации exe'шника необходимо запустить компоновщик (link), указав ему объектный модуль.
Ну COM - это уже отжившее своё.
Такчто в любом случае лучше компилить EXE
Хотя у комов размер меньше.
Вообще у ассемблеров не очень большое различие.
Вот я с легкостью перешел с TASM на FASM и при этом я понял, что с FASM'a надо было начинать с самого начала. Потому что на нем можно тварить чудеса.
// Анекдот в тему: Решил хакер блины печь, первый блин как всегда вышел Комом, а второй уже EXE'шником
// Анекдот в тему: Решил хакер блины печь, первый блин как всегда вышел Комом, а второй уже EXE'шником
в тему))
я тоже хотел начать с fasm'a, но не нашел подходящей литературы, поэтому пришлось поучить masm.
2 slesh, в чем основные различия tasm/masm и fasm? (наиболее интересен синтаксис)
FASM рулит в том что не надо мучаться с компилом.
Все параметры компила пишутся в исходнике проги.
Вот к примеру некоторые из них:
1) format PE GUI at 5000000h - компилит в PE EXE под графическую оболочку и базовый адрес кода - 5000000h
2) format PE - тоже PE EXE но под консоль
3) format PE64 - под 64 битные системы
4) use16 - 16-ти битный bin файла
5) use32 - 32-х битный bin файла
6) format ELF - вообще под линух.
Ну и в томже духе. И вообще в FASM можно ресурсы прописывать внутри кода программы.
2 slesh
1. если указать в исходнике format PE или format PE GUI at 5000000h, то строчкой ниже надо писать use16 или use32?
2. почему com весит 25 байт, а ехе 1 кб, причем при запуске ехе вылезает ошибка. вот сам код:
format PE ; com компилился с format binary
use16 ; закомментивание этой строчки не помогло
org 100h
mov ah,9
mov dx,msg
int 21h
mov ah,0
int 16h
int 20h
msg db 'Hello World$'
2Piflit:
1. Формат PE подразумевает 32 битную адресацию.
2. com - программа на диске находится в таком же состоянии как и в памяти, а в exe присутствует ещё туча всякой служебной инфы, PE заголовок, стаб и т.д.
И ещё, какие нафик прерывания, если ты пишешь под винду? =) Или тогда уже пиши под дос.
причем при запуске ехе вылезает ошибка. вот сам код:
Этот код не может исполняться под Windows(иметь PE формат), т.к. напрямую использует прерывания.
нафиг дос))) буду писать под винду, просто сорц из книжки был именно такой...
чувствую, придется еще одну покупать, типа "асм под вин32"...
нафиг дос))) буду писать под винду, просто сорц из книжки был именно такой...
чувствую, придется еще одну покупать, типа "асм под вин32"...
Ниасилишь скорее всего сейчас под винду, попрактикуйся под дос.
Под винду можешь глянуть Уроки Iczelion'а (http://wasm.ru/publist.php?list=1), правда там под масм, но суть та же.
Ниасилишь скорее всего сейчас под винду, попрактикуйся под дос.
Под винду можешь глянуть Уроки Iczelion'а (http://wasm.ru/publist.php?list=1), правда там под масм, но суть та же.
я сейчас и не собираюсь, только начал=)
килограммы мануалов и wasm.ru мне в помощь))
кстати, я оттуда (wasm.ru) почти дочитал цикл статей про Ollydbg. познавательно))
ЗЫ но ведь дос приложения можно запускать под вин?... через командную строчку... и тогда их соответственно надо компилить в com, как в моем исходнике... я прав?)
ЗЫ но ведь дос приложения можно запускать под вин?... через командную строчку... и тогда их соответственно надо компилить в com, как в моем исходнике... я прав?)
да =)
ЗЫ но ведь дос приложения можно запускать под вин?... через командную строчку... и тогда их соответственно надо компилить в com, как в моем исходнике... я прав?)
И .exe тоже, только директивы поменять нужно, в fasm'e, к сожалению, сейчас не скажу какие именно. Васм, опять же, в помощь. =)
RTFM _http://flatassembler.net/docs.php
как открыть com программу в CodeView?
у меня открываются только exe
Без понимания ассемблера в дос, ты будешь виндовс чайником.
нужно обьединить два исходника на masm, но когда я включаю модули из второй в первую, вылезают ошибки в модуле windows.inc, огромная куча, вида:
syntax error: in structure
structure improperly initialized
symbol type conflict: bool
symbol redefenition: hinst
если его закомментить то ошибки исчезают
и в user32.inc ошибка symbol redefinition : wsprintfA
т.е. как я понял какие-то структуры из windows.inc как-то перекрываются со структурами из других модулей?
как это можно решить, можно ли вторую программу как-нибудь отдельным модулем c подпрограммой сделать, а из первой её вызывать?
;модули первой программы
EXTERN shutdown@8:NEAR
EXTERN recv@16:NEAR
EXTERN send@16:NEAR
EXTERN accept@12:NEAR
EXTERN listen@8:NEAR
EXTERN bind@12:NEAR
EXTERN closesocket@4:NEAR
EXTERN socket@12:NEAR
EXTERN CharToOemA@8:NEAR
EXTERN WSAStartup@8:NEAR
EXTERN wsprintfA:NEAR
EXTERN GetLastError@0:NEAR
EXTERN ExitProcess@4:NEAR
EXTERN lstrlenA@4:NEAR
EXTERN WriteConsoleA@20:NEAR
EXTERN GetStdHandle@4:NEAR
includelib \masm32\lib\user32.lib
includelib \masm32\lib\kernel32.lib
includelib \masm32\lib\ws2_32.lib
includelib \masm32\lib\winmm.lib
include \masm32\include\kernel32.inc
include \masm32\include\winmm.inc
;модули второй программы
include \masm32\include\windows.inc
include \masm32\include\masm32.inc
include \masm32\include\user32.inc
include \masm32\include\wsock32.inc
includelib \masm32\Lib\masm32.lib
includelib \masm32\Lib\wsock32.lib
и в user32.inc ошибка symbol redefinition : wsprintfA
Выход - закомментировать прототип wsprintfA в windows.inc
Это ошибка в масме, wsprintfA объявлена и в user32.inc (где и должна быть) и в windows.inc (где ее за каким-то хреном поместили).
выдрал фтп сервер из пинча
вроде бы компилиться ml /c /coff /Cp ftp.asm
потом линкую link /subsystem:windows ftp.obj
вылезают ошибки unresolved external symbol _SendReply@8
unresolved external symbol _MainSockListen@0
unresolved external symbol _ServeThread@4
в файле obj к функциям SendReply, MainSockListen, ServeThread добавляются какие-то цифры и нижняя черточка перед _функция@8 _функция@0 _функция@4 и линкер не может понять их
что это?
у каво есть рабочий исходник ftp сервера?
ниже то что добавил в файл ftp.asm
.586P
.MODEL FLAT, stdcall
include Inc\windows.inc
include Inc\kernel32.inc
include Inc\user32.inc
include Inc\advapi32.inc
include Inc\ws2_32.inc
include Inc\wsock32.inc
include Inc\oaidl.inc
include Inc\pinch.inc
include Inc\ole32.inc
include Inc\shlwapi.inc
include Inc\oleaut32.inc
include Inc\shell32.inc
include Inc\masm32.inc
include Inc\rasapi32.inc
include Inc\gdi32.inc
include Inc\oaidl.inc
include Inc\aplib.inc
include Inc\urlmon.inc
include Inc\wininet.inc
includelib Lib\ole32.lib
includelib Lib\kernel32.lib
includelib Lib\user32.lib
includelib Lib\oleaut32.lib
includelib Lib\advapi32.lib
includelib Lib\shlwapi.lib
includelib Lib\shell32.lib
includelib Lib\masm32.lib
includelib Lib\wsock32.lib
includelib Lib\ntdll.lib
includelib Lib\ws2_32.lib
includelib Lib\rasapi32.lib
includelib Lib\gdi32.lib
includelib Lib\urlmon.lib
includelib Lib\aplib.lib
includelib Lib\wininet.lib
start:
invoke startftp
end start
у мну лам проблем.
имеется такой код на масм:
.DATA
Buff db 100
.code
start:
mov [Buff], byte "A"
end start:
надо вообщем в буффер вставить А.
но ошибка.
помогите пожалуйсто
2 x-treem тебе нужно весь буфер забить символом A?
Если а то вот код на FASM
xor edi,edi
m:
mov [Buff+edi], byte "A"
inc edi
cmp edi,100
jbe m
я с масм не работал, поэтому незнаю прокатит
mov [Buff+edi], byte "A" или нет.
Ты попробуй сделать так:
xor edi,edi
lea ebx,buff
mov al,"A"
m:
mov [ebx+edi], byte al
inc edi
cmp edi,100
jbe m
не, мне нуна добавлять туда символы.
сначала например А
потом Hello
потом puki
а потом вывести в мессаджбоксе
2x-treem:
Если мне не изменяет память, так работать с памятью нельзя. Надо через регистры.
Типа:
mov AL, byte "A"
mov [Buff], AL
не, мне нуна добавлять туда символы.
сначала например А
потом Hello
потом puki
а потом вывести в мессаджбоксе
Ну тогда юзай АПИ функцию
mov [Buff], 0
invoke lstrcat,[Buff],'HELLO' ; добавить данные к буферу
iv. с памятью можно так работать, это же не из одного места памяти в другое, это в область памяти число пересылается... команда mov - это сделать в силах! mov Buff, "A" ;)
x-treem
.386
.model flat, stdcall
option casemap:none
.DATA?
Buff db 100 dup(?)
.code
start:
mov [Buff], "A"
ret
end start
Нужно было обьявить правильно буфер "Buff db 100 dup(?)" + "end start:" - двоеточие не нужно...
P.S. x-treem Символы добавляются откуда? из DATA или просто в коде по штуке? или тебе сразу строку можно в буфер положить?
у мну lstrcat не работает. то естьвот
.DATA
Buff db 100
.CODE
start:
mov al, "И"
mov [Buff], al
xor al,al
mov al, "з"
add [Buff+1], al
add [Buff+2], al
mov [Buff], 0
invoke lstrcat,[Buff],"HELL"
invoke MessageBox, 0, addr Buff, addr Buff, MB_OK
invoke ExitProcess, NULL
end start
и нету мессадж бокса. да и вообще только 4 символа можно добавить
что тут не так?
GoreMaster
25.06.2007, 12:43
invoke lstrcat,[Buff],"HELL"
"HELL" должна быть определена в .data как строка
---------Пример функции lstrcat----------------
.data
hell db "HELL",0
.code
invoke lstrcat,addr Buff,addr hell
------------------Работа с символами-------------------
lea edi, Buff
mov al, "и"
mov byte ptr ds:[edi] , al
xor al,al
inc edi
mov al,"з"
mov byte ptr ds:[edi] ,al
имхо так
x-treem Если ты пишешь на masm'e то все данные в виде строк и т.д. нужно хранить в .data ,а буферы в .data? ... В fasm'e немного по другому...
;################################################# ##
.386
.model flat, stdcall
option casemap :none ; case sensitive
;################################################# ##
include C:\masm32\include\windows.inc
include C:\masm32\include\user32.inc
include C:\masm32\include\kernel32.inc
includelib C:\masm32\lib\user32.lib
includelib C:\masm32\lib\kernel32.lib
;################################################# ##
.DATA
Buff db 100 dup(?)
szMsg db "Hello",0
;################################################# ##
.code
start:
mov Buff, "A"
invoke MessageBox, 0, ADDR Buff, ADDR Buff, 40h
invoke MessageBox, 0, ADDR szMsg, ADDR szMsg, 40h
invoke lstrcpy, ADDR Buff, ADDR szMsg
invoke MessageBox, 0, ADDR Buff, ADDR Buff, 40h
invoke ExitProcess, 0
end start
;################################################# ##
Некоторые приемы вывода в Мессаге...
как обычно компилю тасмом com программу
--------------------код------------------------
cseg segment
assume cs:cseg, ds:cseg,es:cseg,ss:cseg
org 100h
start:
mov ax, 0b800h
mov es,ax
mov di, 0
mov ah,31
mov al, 1
mov es:[di], ax
mov ax, 10h
int 16h
int 20h
cseg ends
end start
--------------------код------------------------
tasm program.asm
tlink program.obj/t/x
все ок(тасм ошибок никаких не выдает) , запускаю из командной строчки и программа виснет(ОС не виснет) , смайлик не выводится.... хотя раньше выводился. В чем может быть проблема?
Tikson
Скомпилил MASM'ом, запустил в Volkov Commander - все работает
FeraS
интерсно как это у тебя получилось , если у меня там ошибка (вместо mov ax, 10h нужно было писать mov ah, 10h) ? Но даже так не работает
Tikson А ты Masm'om или tasm'om пробывал?
FeraS
интерсно как это у тебя получилось , если у меня там ошибка (вместо mov ax, 10h нужно было писать mov ah, 10h) ? Но даже так не работает
опять же смотря чем компилить и как проверять результат если в отладчике то он перед запуском обнулит все регистры и вообще это не синтаксическая ошибка и повлиять на компиляцию не может
извините за супер ламерский вопрос но как скомпилить asm код? и чем это удобнее сделать :) с меня +
извините за супер ламерский вопрос но как скомпилить asm код? и чем это удобнее сделать с меня +
Не поверишь, но с помощью компилятора. TASM, MASM, FASM, NASM..
Я бы на твоем месте сразу убился, задавая такие вопросы.
не все так просто я в MASM вставляю код щелкаю в меню Project по кнопке Compile Resourse файл и он мне пишет no file loaded
GoreMaster
13.07.2007, 03:51
в qeditor'е пакета masm32 вверху вкладка Project и там выбираешь Build All
или батфайлом
Example:
@echo off
if exist Keygen.exe del Keygen.exe
if exist Keygen.obj del Keygen.obj
if exist rsrc.res del rsrc.res
if exist rsrc.obj del rsrc.obj
\masm32\bin\ml /c /coff Keygen.asm
\masm32\bin\rc rsrc.rc
\masm32\bin\cvtres /machine:ix86 rsrc.res
\masm32\bin\Link /SUBSYSTEM:WINDOWS Keygen.obj rsrc.obj
if exist Keygen.obj del Keygen.obj
if exist rsrc.obj del rsrc.obj
if exist rsrc.res del rsrc.res
Пример взят из обычного Keygen Template'а
блин вроде разобрался) только там код шо писец... несколько страниц сурового кода в одну строчку и ниодного коментария. пишет что нельзя скомпилить изза того что строчка слишком длинная.((((
Офигеть!Не разу не просила помощи!Но в элементарных вещях можно разобраться и самому!
блин вроде разобрался) только там код шо писец... несколько страниц сурового кода в одну строчку и ниодного коментария. пишет что нельзя скомпилить изза того что строчка слишком длинная.((((
у тебя волшебный некомпилирующийся пример. станцуй ритуальный танец с африканскими бусами и пример соберется сам собой.
to >> А®ТеS
" INVOKE " -> Это довольно удобная команда. Удобство ее заключается, во-первых, в том, что мы сможем забыть о добавке @N. Во-вторых, эта команда сама заботится о помещении передаваемых параметров в стек. Последовательность команд
PUSH par1
PUSH par2
PUSH par3
PUSH par4
CALL NAME_PROC@N ; N-количество отправляемых в стек байт
заменяется на
INVOKE NAME_PROC, par4, par3, par2, par1
Но надо помнить что в TASM отсутствует директива INVOKE .:)
С какой книжки мона начаьт изучать асм???
z01b > см. вторую страницу этой же темы и ещё тут (https://forum.antichat.ru/thread44172.html).
Да хоть с этой )
http://www.wasm.ru/tools/22/opcodes.zip
но лучше с Питера Абеля
Ваще то нада начинать с протого ))) к примеру некоторые начинали с С++ и делфи а 3аканчивали машинными кода но не всегда асм рулит !!! В зависимости какой алгоритм нада сделать ведь далеко асм не есть эталоном програмирования !!!
На досуге изучаю защищенный режим интела, возникло пока пара вопросов:
Почему GS инициализируется нулем?
Почему часть сегментных регистров имеют одинаковые значения?
На васме говорится про два различных селектора, а на деле же получается три, как это объяснить?
!_filin_!
02.08.2007, 22:34
точно ответ не помню, поэтому чтоб не врать ,советую тебе почитать книги по асму. В любой хорошой книге по асму в самом начале описуется архитектура процессора.
почитать книги по асму
Все?
В любой хорошой книге по асму в самом начале описуется архитектура процессора.
И что?
2 iv. А ты не задавался вопросом. почему переход на защищенный режим идет через контроллер клавы?
Походу дела в Intel тоже траву курят
Отцы программинга подскажите как превратить shellcode (в виде binary файла) в .exe файл.
>>Отцы программинга подскажите как превратить shellcode (в виде binary файла) в .exe файл.
Если теоретически то
-сперва надо создать обьект ядра типа процесс с флагом CREATE_SUSPENDED что б приостановить его выполнение, это надо для редактирования его адрессного прространства
-далее выделить память в удаленном адрессном пространстве спомощью VirtualAllocEx
после скопировать этот массив байт(shellcode) WriteProcessMemory
-и наконец продолжить прерванный ранее поток ResumeThread
это в крадце и теоретически, если надо практически, то есть программка, которая это все иллюстрирует правда писал я ее на паскале по некоторым причинам, здесь ее выкладывать не буду по причине "не потеме топика" могу в пм или если кому нада забабахаю кратенькую статейку с кодом и коментариями и выложу где нибудь здесь
da_ff, Что вопрос, что ответ - и то и то полнейший бред
почему бред? я по крайней мере здоров (хотя родители говорят что меня скоро отправят в дурку)
rus2k видимо расчитывает таким образом сделать криптор
в выходной программе будет ввиде массива храниться зашифрованный код входной программы и расшифровываться и исполняться при запуске выходной
по крайней мере я вижу только такой смысл
Отцы программинга подскажите как превратить shellcode (в виде binary файла) в .exe файл.
Всё очень просто - нужно самому заполнить структуру MZ_HEAD, PE_HEAD, TABLE_SECTION и сохранить всё в файл. Более проще будет - скомпилить на ASM маленькую прогу. которая не будет экспортировать несколько функций, а именно - GetProcAddress и LoadLibrary - это в зависимости от того, как юзает шел код библиотеки.
ПОтом просто настрой заменить её внутренности на шеллкод и подправить некоторые значения. Типа: Размер секции виртуальный и реальный. И кол-во озушки требуемой для проги.
Задачка проще некуда
Вот код проги на FASM которую можно юзать как шаблон
format PE GUI
include 'd:\coding\fasm\include\win32ax.inc'
entry _start
section '.idata' import data readable writeable
library kernel32,'KERNEL32.DLL'
include 'd:\coding\fasm\include\apia\kernel32.inc'
section '.code' code readable writable executable
_start:
ret
invoke LoadLibrary
invoke GetProcAddress
после компила - достаточно запихать шелкод по смешению 200h и подправить некоторые структуры
ToniKapuchon
07.08.2007, 03:22
Вопрос новерное ламерский но всётаки спрошу... а как *.asm превратить в шеллкод
http://www.shellcode.ru/index.php?name=News&file=print&sid=18
2 ToniKapuchon - компельнуть в bin файл ;)
Вот выбрал для себя фасм =)) маленький и удобный вот :p
но как делать фунции непонимаю
в делфе
function Msg(text : string):boolean;
begin
MessageBox(0,PChar(text),0,0);
end;
а как на фасм это перевести хз :((
zl0y
Рекомендую для начала почитать статьи на wasm.ru
Также посмотри примеры программ В папке EXAMPLES FASM'а
ЗЫ:
public myproc
myproc:
; тут тело функции
mov eax,результат
ret
народ помогите найти drvcomm.INC пожалуйста!!!! весь гугл облазил!!!
мне именно фунцию надо а не просто call :((
Zloy
proc test__ arg
stdcall [MessageBox],0,[arg],0,0
ret
endp
Насколько я понял, в основном, идут проблемы с синтаксисом... Вот тебе пара основных мануалов http://dump.ru/files/h/h8318788728/
http://dump.ru/files/h/h45448514/
Краткий экскурс так сказать
2 ZloY -
на фасме все просто. я вот так вот язаю функции:
proc MyFUNC param1,param2
.-.-.-.-.-.-.-.-.-.-.-
ret
endp
Как повелось в винде то функция возвращает значение через регистр eax.
поэтому результат выполнения пихаешь туда и всё будет ок.
А вызывать эту функцию:
stdcall MyFUNC,eax,buf_2
Zloy
Выбери себе книгу http://forum.antichat.ru/thread31398.html и прогони её по быстрому и будет счастье! Типы данных, циклы, массивы и т.д. ты все это знаешь, а дело за синтаксисом ;)
При линковке в TLINK32, вы[одит следующая ошибка
C:\>tlink32 HELLO1.obj
Turbo Link Version 1.6.71.0 Copyright (c) 1993,1996 Borland International
Error: Unresolved external 'MESSAGEBOXA' referenced from module HELLO1.ASM
Error: Unresolved external 'EXITPROCESS' referenced from module HELLO1.ASM
как исправить? ))
z01b,
http://forum.codenet.ru/showthread.php?t=6245
Вообщем то tasm уже не актуален.
z01b,
http://forum.codenet.ru/showthread.php?t=6245
Вообщем то tasm уже не актуален.
а почему не актуален?
С масм32 попробовал компилить, и тоже самое ошибка (
hello.obj : warning LNK4033: converting object format from OMF to COFF
hello.obj : error LNK2001: unresolved external symbol ExitProcess
hello.obj : error LNK2001: unresolved external symbol MessageBoxA
LINK : error LNK2001: unresolved external symbol _mainCRTStartup
hello.exe : fatal error LNK1120: 3 unresolved externals
Дайте плз ктонибудь Hello World, на масм 9.0
ты исходник выкладывай.
а почему не актуален?
Разработка прекращена очень давно, сейчас им почти не пользуются. Наиболее перспективный сейчас fasm.
Хочу прочитать данные реестра (MASM32 v 8.2), но в итоге получаю Win32 ошибку :(
где ошибка?
.386
.model flat, stdcall ; 32 bit memory model
option casemap :none ; case sensitive
include \masm32\include\windows.inc
include \masm32\include\kernel32.inc
include \masm32\include\advapi32.inc
include \masm32\include\user32.inc
includelib \masm32\lib\kernel32.lib
includelib \masm32\lib\advapi32.lib
includelib \masm32\lib\user32.lib
.data
SubKey db "SOFTWARE\Microsoft\Windows\CurrentVersion\Run"
vName db "DataLayer"
rt dd 1
rc dd 127
mbCapt db "RegValue",0
.data?
key db ?
buf db ?
.code
start:
invoke RegOpenKeyEx, HKEY_LOCAL_MACHINE, SubKey, 0, KEY_ALL_ACCESS, key
invoke RegQueryValueEx, key, vName, NULL, addr rt, addr buf, addr rc
invoke RegCloseKey, key
invoke MessageBox, NULL, addr buf, addr mbCapt, MB_OK
invoke ExitProcess, 0
end start
z01b,
.386
.model flat,stdcall
option casemap:none
include \masm32\include\windows.inc
include \masm32\include\kernel32.inc
includelib \masm32\lib\kernel32.lib
include \masm32\include\user32.inc
includelib \masm32\lib\user32.lib
.data
MsgBoxCaption db "Antichat",0
MsgBoxText db "Hello World!",0
.code
start:
invoke MessageBox, NULL, addr MsgBoxText, addr MsgBoxCaption, MB_OK
invoke ExitProcess, NULL
end start
t04 > Лови:
.386
.model flat, stdcall ; 32 bit memory model
option casemap :none ; case sensitive
include \masm32\include\windows.inc
include \masm32\include\kernel32.inc
include \masm32\include\advapi32.inc
include \masm32\include\user32.inc
includelib \masm32\lib\kernel32.lib
includelib \masm32\lib\advapi32.lib
includelib \masm32\lib\user32.lib
.data?
key dd ?
buf db 1024 dup (?)
.data
SubKey db "SOFTWARE\Microsoft\Windows\CurrentVersion\Run",0
vName db "DataLayer",0
mbCapt db "RegValue",0
rt dd REG_SZ
bsz dd sizeof buf
.code
start:
invoke RegOpenKeyEx, HKEY_LOCAL_MACHINE, addr SubKey, 0, KEY_QUERY_VALUE, addr key
invoke RegQueryValueEx, key, addr vName, 0, addr rt, addr buf, addr bsz
invoke RegCloseKey, key
invoke MessageBox, NULL, addr buf, addr mbCapt, MB_OK
invoke ExitProcess, 0
end start
1 На Delphi есть функция - ParamStr, она возвращает параметры командной строки, типа ParamStr(0) это полный адрес программы, ParamStr(1) это первый параметр и т.д.
Есть ли аналог на МАСМ32?
2 Как на МАСМ32 юзать массивы? Например запустить цикл типа
for i := n to m do
WriteLn(A[i])
если не трудно то приведите Plz примеры
t04, в теме есть пример работы с аргументами командной строки на фасме, но на масм не проблема перевести.
http://forum.antichat.ru/thread28998.html
Массивы:
size equ 20
.data?
numb WORD size dup(?) ; область памяти для 20 идущих подряд WORD
.code
start:
mov ecx, size ; для цикла
mov bx, 1
xor edi, edi ; обнуляем edi
next:
mov numb[edi], bx
inc bx
add edi, 2 ; к следующему числу(word - 2 байта)
loop next
invoke ExitProcess, 0
end start
Регистр edi хранит адрес слова, полученный относительно начала массива, значит само слово будет выглядеть как numb[edi]. При edi равном нулю, mov numb[edi], bx запишет содержимое bx в нулевое слово массива. Надеюсь принцип понятен.
в теме есть пример работы с аргументами командной строки на фасме
Вот и он (http://flatassembler.net/examples/cmd.zip).
Народ, вот прочитал значение реестра в массив, а как можно узнать присутствие в нем определенной строки? или как массив в строку переделать, а потом сравнить?
нужно типа следующего:
if Pos(subStr,Str) then
WriteLn(SubStr+' присутствеут в '+Str)
else
WriteLn(SubStr+' отсутствеут в '+Str);
нашел такое:
cmp buf,'SubString'
je label1;или как я понял можно и jz
label1:
invoke MessageBox, NULL, addr buf, addr Prisutstvuet, MB_OK
label2:
invoke MessageBox, NULL, addr buf, addr Otsutstvuet, MB_OK
но не разобрался как с этим работать :(
ЗЫ нужно что бы учитывало реестр символов.
GoreMaster
19.08.2007, 20:11
ЗЫ нужно что бы учитывало реестр символов.
Может регистр символов? О_о
> cmp buf,'SubString'
это че за долбоенб писал?
cmp buf,'SubString'
Это просто жесть...
Если учитывать регистр символов то туть можно через хеш:
_1 db 'Lamia',0
_2 db 'lamia',0
title db 'Слова разные',0
_title db 'Слова одинаковые',0
entry $
xor esi,esi
mov edi,_1
next:
mov eax, edi
xor edx, edx
hash:
rol edx, 3
xor dl, byte [eax]
inc eax
cmp byte [eax], 0
jnz hash
cmp esi,0
je @
cmp esi,edx
je f@
invoke MessageBox,0,title,0,0
jmp exit
@:
mov esi,edx
mov edi,_2
jmp next
f@:
invoke MessageBox,0,_title,0,0
exit:
ret
что делает инструкция int?
Инструкиця INT xx делает следующее:
1) Если она выполняется в реальном режиме, то ее псевдокод такой:
pushf
push cs
push ip
// из слова 0:[xx<<4] берется сегмент, из слова 0:[xx<<4 + 2] берется смещение и выполняется дальний переход на этот адрес - обработчик прерывания.
2) Если она выполняется в защищенном режиме, то ее псевдокод такой:
pushfd
push cs
push eip
// проверка защиты
// смена уровня привилегий если нужно
// прыжок на адрес, задаваемый селектором IDT[xx].Selector и смещением IDT[xx].Offset
В двух словах оно нужно для передачи управления некоторой фиксированной системной процедуре для выполнения определенного действия.
В DOS/Windows системные апи реализованы в виде прерываний (в Windows только до XP, дальше идет другой механизм).
BIOS устанавливает свои обработчики для аппаратных сервисов.
Еще кроме программных прерываний есть аппаратные прерывания. Например: 1 или 3. Процессор генерирует их сам, если произойдет определенное событие.
scrat я полагаю тебя интересует вин? Винда работает в пмоде, так что тебе нужен пункт 2, привиденный гритом. Кстати, про перывания есть множество статей, если хочешь узнать про них больше - поищи на васме например.
>>в Windows только до XP, дальше идет другой механизм
sysenter имеешь ввиду?
>>в Windows только до XP, дальше идет другой механизм
sysenter имеешь ввиду?
именно
на счёт поиска подстроки - лучше юзать repe cmps. у зубкова написано. есть специальная фича для сравнения строк - cmpS. но и просто байтово можно через cmpb вроде. карочу зубкова есть хорошая глава про префикс повторения и команды сравнения. ну а дальше тока вшений цикл, который сдвигает смещение в строке, в которой ищется подстрока.
inv Говорит неизвестная функция InitCommonControls - т.к. мы не подключили библиотеку comctl32.lib, т.е.
include \masm32\include\comctl32.inc
includelib \masm32\lib\comctl32.lib
Это с первой ошибкой, а со второй попробуй сам - есть в masm такая фича C:\masm\liblist.exe - она показывает в какой библиотеке какая функция, т.е. какие библиотеки нужно подключать, такого не было!
я вместо comctl подключил comdlg (я просто редактировал предыдущий пример и туториала и сразу не заметил разницы)
Я уже нашел ошибку=\и потер пост,все оставшиеся ошибки были по той же причине.
За liblist спс
inv Я бы для начала посоветовал книжку - http://forum.antichat.ru/showthread.php?p=409909 3 или 10 пост! Я думаю книга продуктивнее туториала для начала будет... ИМХО
У меня крупник в книжном варианте=\есть,собственно с него я и начинал,
В туториале конкретно по асме мало что есть,но мне нужно именно то что там изложено.
!_filin_!
30.08.2007, 02:04
Видел для с++ книгу, сборник различных задач ( и ответы на них) , может кто знает что-то подобное для асма? для повышения квалификации ( и просто тернировки мозга)
!_filin_!
30.08.2007, 03:03
спасибо за содержательный ответ,а поподробней можно?
2 !_filin_! Лучший способ это напистаь чтонить более менее сложноватое.
Когда придумываешь чтото свое то быстро научишься нежеле по всяким книгам.
!_filin_! Повторяюсь хорошие книги по асму предложены здесь
http://forum.antichat.ru/showthread.php?p=409909 я бы посоветовал там поглядеть из 3 или 10 поста!
!_filin_!
01.09.2007, 01:25
спасибо, почему то незамечал топик, вижу по содержанию что книга неплохая, но всё таки нет практических задач?
!_filin_! Именно практических задач и много -> книга учит синтаксису + неплохим начальным знаниям по общему устройству masma .... ИМХО :)
Практика? Учебники по алгебре с 8 по 11, решай задачи с максимальной оптимизацией алгоритма.
NeXArmAor
03.09.2007, 13:26
Вопросец есть один...как включить в масме режим чтения бинарных файлов? Нужно,чем раньше будет ответ,тем лучше. Искал везде...в делфях включается режим FileMode:=0 а в асме как?.
NeXArmAor В масме думаю нет понятия бинарное чтение или чтение строк к примеру, т.к. нет библиотек типа MFC и VCL -> поэтому чтение осуществяется с помощью WinAPI функций, в частности:
invoke ReadFile, hFile, addr Buffer, nCount, addr dwTemp, 0
где hFile - хендл файла, из которого читать (получаем после вызова CreateFile)
Buffer - буфер, может быть обьявлен как "Buffer db 1024 dup(?)";
nCount - это число, т.е. сколько байт считать
dwTemp - это переменная, куда будет записано, сколько байт реально считаны было
0 - этот параметр используется для синхронизации потоков ввода\вывода, нам не нужен!
NeXArmAor
03.09.2007, 13:58
xqwerx,Лага не в этом,попробуй записать,ну например архивы, с помощью функции UpdateResource в любой exe файл(именно в ресорсы). Так чисто для примера,с помощью той же ReadFile. Файл запишется,но частично. Т.е первые 4 байта. А мне нужно чтобы писал весь код файла в ресурс. Текстовые пишутся но проблем,а бины не жуются. На делфях нужно было выставлять режим чтения файлов. А как быть тут. В асме не новичок,но здесь не совсем понятно. И если у тебя получится,покажи код.
пример:
=============
здесь идет чтение архива
=============
Запись в ресорсы
invoke BeginUpdateResource,addr Файло
invoke UpdateResource,dw,ResourceName,ResType,0,FileConte nt,SizeOfFileContent
invoke EndUpdateResource,dw
Т.е первые 4 байта
Это уже на что-то должно наводить! Посмотри повнимательнее свой код, может где-то опечатался и передал данные, а не указатель на них или на оборот.
// P.s. Ну а лучше приведи кусок кода с обьявленными переменными, который нужно отладить...
Дабавляю:
BOOL UpdateResource(
HANDLE hUpdate, // update-file handle
LPCTSTR lpType, // address of resource type to update
LPCTSTR lpName, // address of resource name to update
WORD wLanguage, // language identifier of resource
LPVOID lpData, // address of resource data
DWORD cbData // length of resource data, in bytes
);
lpType,lpName, lpData - должны передаваться как указатели т.е. в твоем случае "ADDR ResourceName". Подправь имена передаваемых переменныx и sizeof раздельно...
И ещё ты может при чтение из архива прочел 4 байта и все!
NeXArmAor
03.09.2007, 14:11
Вот допустим пример с мэппингом и его запись в ресы.
Здесь не весь код,весь код слишком большой,а вообще я реализовал джойнер и застрял на данном этапе.
invoke _lopen,offset File,OF_READ
mov sm1,eax
invoke CreateFileMapping,sm1,NULL,PAGE_READONLY,0,0,NULL
mov sm9,eax
invoke MapViewOfFile,sm9,FILE_MAP_READ,0,0,0
mov sm10,eax
invoke UpdateResource,sm4,addr ResName,addr sm5,0,sm10,eax
invoke _lclose,sm1
invoke UnmapViewOfFile,sm10
Где sm1,sm9,sm10,sm4,sm5 являются двордами
invoke UpdateResource,sm4,addr ResName,addr sm5,0,sm10,eax
Шестой параметр -> "DWORD cbData // length of resource data, in bytes"
это ты зачем в него ложишь eax - это же у тебя указатель на данные в памяти (фактически на первый байт файла спроецированного в память)!!!
Разберись с этим! GetFileSize тебе в помошь...
NeXArmAor
03.09.2007, 14:21
xqwerx, eax исходит от другого параметра,как раз от длины файла. Я не стал в коде его приводить.
NeXArmAor Млин ну а как тебе тогда помочь, если ты не приводишь весь код, а только обрывки на которые ты думаешь, что здесь ошибка! Так очень долго можно играться :)
invoke ReadFile, hFile, addr Buffer, nCount, addr dwTemp, 0
...
0 - этот параметр используется для синхронизации потоков ввода\вывода, нам не нужен!
Не только, еще для чтения не с текущей позиции =\
NeXArmAor
03.09.2007, 14:37
xqwerx , вот код,которого я думаю будет достаточно для проверки:
invoke BeginUpdateResource,addr File ;Файло ресурсы которого апдейтятся
invoke _lopen,offset FtE,OF_READ ;файло которое записывается
mov sm1,eax
invoke CreateFileMapping,sm1,NULL,PAGE_READONLY,0,0,NULL
mov sm9,eax
invoke MapViewOfFile,sm9,FILE_MAP_READ,0,0,0
mov sm10,eax
invoke lstrlen,sm10
invoke UpdateResource,sm4,RT_RCDATA,1,0,sm10,eax
invoke _lclose,sm1
все sm'мы дворды...
invoke UnmapViewOfFile,sm10
_Great_
Ну да... Если файл открыт с флагом FILE_FLAG_OVERLAPPED,то lpOverlapped для синхронизации! Если флага FILE_FLAG_OVERLAPPED нет, то lpOverlapped - как смещение! (Подобно SetFilePointer)
// Я его обычно для синхронизации юзаю :)
invoke lstrlen,sm10
Lol -> Вот она и ошибка! Как можно размер файла мерить функций для строк! lstrlen- эта функция перебирает байты и когда находит 0x00 - то значит конец строки и возвращает количество байтов до нуля, это для работы с null-terminated string! :)
Поэтому у тебя и записываются в ресурсы 4 байта в частности сигнатура DOS заголовка "MZ" это же строка в начале файла и заканчивается она нулевым байтом...
Это можно заметить при просмотре файла в HEX-режиме ;)
00400000 4D 5A 90 00 03 00 00 00 04 00 00 00 FF FF 00 00 MZђ.......яя..
00400010 B8 00 00 00 00 00 00 00 40 00 00 00 00 00 00 00 ё.......@.......
Говорю GetFileSize тебе в помошь:
DWORD GetFileSize(
HANDLE hFile, // handle of file to get size of
LPDWORD lpFileSizeHigh // address of high-order word for file size
);
invoke GetFileSize, sm1, 0
теперь в eax размер файла!!!
NeXArmAor
03.09.2007, 14:55
Все решилось..был невнимателен.хаха...дело в том я перепутал лстрлен и гетфайлсайз,у меня там идет запись имен файлов в ресурсы,так вот lstrlen как раз должен был использовать для имен файлов, а использовал для размера файла.
zeppe1in
02.10.2007, 22:36
invoke recv, hSocket, addr bufer, sizeof bufer, 0
собственно ресивлю хтмл страницу от веб сервера.
как лучше это сделать?
непонятно как быть с памятью
bufer db 1000000000000 dup (?)
так ведь непойдёт)
Digimortal
03.10.2007, 02:43
>> bufer db 1000000000000 dup (?)
>> так ведь непойдёт)
да нормально петабайтная страница как раз поместица.. +))
VirtualAlloc, VirtualFree....
delay(0)
18.10.2007, 22:40
Есть книжка, с кучей примеров кода, но во всех автор инклудит свою библиотеку, и использует описаные там процедуры... Нашел на диске следующие файлы:
http://i042.radikal.ru/0710/63/13d76e5e03d8.jpg
---
Как умел раскидал их по директориям, но видно, что плохо умею. :)
Microsoft (R) Macro Assembler Version 6.14.8444
Copyright (C) Microsoft Corp 1981-1997. All rights reserved.
Assembling: C:\masm32\progs\5.asm
C:\masm32\progs\5.asm(3) : fatal error A1000: cannot open file : irvine32.inc
Как грамотно её добавить?
Кидай irvine32.inc в C:\\masm32\Include
А потом: include /masm32/include/irvine32.inc
Подскажите удобную среду разработки ассемблерных программ (блокнот не предлагать)
Visual asm, MASM - builder, а так я за блокнот :)
По мне так это Radasm!Поддержка многих компиляторов!Но на вкус и цвет как говорится....
Negatory Assembly studio
http://www.negatory.com/asmstudio/
Negatory Assembly studio
+1, тоже его юзаю. Ну, а почти полное раскрытие сабжа:
http://www.wasm.ru/article.php?article=ide
Спасибо, будем узать...
И сразу ещё вопрос. Где можно найти статьи, как пишутся джойнеры +исходник на асме(или они пишутся на с++)?
Нафига нужна ассемблеру студия визуальная? Или там в разработках участвуют тысячи человек, которым нужна правильная студия, синхронизация исходников, сервер специальный, удобные ф-ии редактирования, сборки ? А то, что на wasm статья про IDE (для "больших проэктов") - это пиздеж какой-то. Большой проэкт писать, используя ассемблер это в любом случае минимум ТУПО. Да и вообще смысл использовать АСМ есть крайне редко, намного реже, чем его юзают.
И сразу ещё вопрос. Где можно найти статьи, как пишутся джойнеры +исходник на асме(или они пишутся на с++)?
Тут глянь:
Джойнеры на асме и на с++ (если пишутся) (http://img89.imageshack.us/img89/1029/joinmq1.jpg)
AFoST Исходник простого джойнера на асме подробнее ТУТ (http://www.forum.glofff.com/showthread.php?t=15)
// В добавок исходник последнего легендарного MicroJoiner v1.7 SOURCE (http://glofff.com/dl/mj17src.rar)
Killerkod
21.11.2007, 15:25
Вот значит у меня такая проблема. Когда пытаюсь чтонибуть откомпиллить в MASM32, он мне выдает ошибку - MASM : fatal error A1000: cannot open file : C\Documents.asm
Вот типа не может этот файл открыть... А где этот файл взять? Пробывал просто создать, но он пишет типа файл пустой... В чем дело?
видимо проблема в c:\Documents%20and%20settings... то есть масм воспринимает пробел как конец строки. заведи для него другую папку, в пути к которой не будет пробелов, например c:\masm
чем отличаются 0 и Null ?
Piflit В машинном представлении ничем. ЭТО 0x00
А для препроцесора это логическая окраска. Правдо я незнаю её :)))
А для препроцесора это логическая окраска. Правдо я незнаю её
Разве?
#define NULL 0
А в асм:
NULL equ 0
movejump
02.12.2007, 23:59
Писал на асме только под МсДос, сейчас перехожу под Винду и *юникс.
Помогите, напишите на асме под Винду, чтоб на консоль выводила "hi".
http://www.wasm.ru/article.php?article=1022006
Разве?
#define NULL 0
А в асм:
NULL equ 0
Конечно. Ты меня не понел, никто не спорит что Null = nil = 0. Но в Делфи, к примеру nil это указатель в никуда, т.е. нулевой и если юзать 0, то препроцессор выдает WARNING.
...это логическая окраска. Правдо я незнаю её ))
Я задаю сего тупой вопрос - какой язык лутше учить в начале ассемблер или Пескаль???
и плиз если можно вылодите книги по етим языкам(и проги которые нужны для работе с ними)
Заранее благодарю
Я задаю сего тупой вопрос - какой язык лутше учить в начале ассемблер или Пескаль???
и плиз если можно вылодите книги по етим языкам(и проги которые нужны для работе с ними)
Заранее благодарю
Можно и асмом начинать. Советую прочитать Ассемблер, это просто! О. Калашников(DOS), а также Крупника (win32)
Crazyyy, но лучше с паскаля начни =) Он прощё.
Писал на асме только под МсДос, сейчас перехожу под Винду и *юникс.
Помогите, напишите на асме под Винду, чтоб на консоль выводила "hi".
.386
.model flat
option casemap:none
include windows.inc
include kernel32.inc
.data
sConsoleTitle db "Antichat.ru",0
sText db "Hi!!!",0
.code
Main PROC
LOCAL hStdout:DWORD
invoke SetConsoleTitleA, offset sConsoleTitle
invoke GetStdHandle, STD_OUTPUT_HANDLE
mov hStdout,eax
invoke WriteConsoleA, hStdout,offset sText,16d,0,0
invoke ExitProcess,0
Main ENDP
end Main
И не забывай линковать нужно со следуйшим флагом
link.exe /SUBSYSTEM:CONSOLE
NeXArmAor
26.12.2007, 17:17
Как можно обойти эвристику каспера 7,возможно ли ее обойти вообще? Мне нужно для криптора,так как после криптовки(путем добавления секции) пинча он палится как Heur.Crypted.Trojan непонятно с чего бы.Как убрать этот Heur? SEH еще в моде,если да то как правильно его использовать?
NeXArmAor Здесь идет проверка файла по косвенным признакам! А именно в какую секцию падает OEP. Entry point обычно идет в первую секцию, секцию кода. Посмотри реализацию в RPCrypt (Маскировать OEP) или аналогичную в FreeCryptor (Не менять OEP).
NeXArmAor
26.12.2007, 17:54
GlOFF, не совсем понятно...по подробнее.
NeXArmAor, Entry point не ставь в последнюю секцию, т.е. вообще не меняй её. А на оригинальной точке входа делай прыжок в последнюю секцию. А OEP потом восстановишь.
Писал на асме только под МсДос, сейчас перехожу под Винду и *юникс.
Помогите, напишите на асме под Винду, чтоб на консоль выводила "hi".
А вот не под винду :-D
.text
.global _start
_start:
xorl %eax,%eax
movl %eax,%ebx
addb $4,%al
incb %bl
movl $msg,%ecx
movl $len,%edx
int $0x80
xorl %eax,%eax
movl %eax,%ebx
incb %al
int $0x80
msg:
.ascii "hi\n"
len = . - msg
trojMann[A1h]
29.12.2007, 20:09
Есть такая проблема: бинарный код из файла импортируется в код (FASM)
mycode file 'mycode.bin'
Далее в точке входа делается call mycode, теперь получает управление код, а теперь вопрос: как вернуть управление после завершения работы загруженного кода на следующую команду после call mycode??
']Есть такая проблема: бинарный код из файла импортируется в код (FASM)
mycode file 'mycode.bin'
Далее в точке входа делается call mycode, теперь получает управление код, а теперь вопрос: как вернуть управление после завершения работы загруженного кода на следующую команду после call mycode??
ret
Flame of Soul
05.01.2008, 21:35
С Новым годом всех!
Ребят помогите, как на асме извлечь квадратный корень из целого числа?
Уже сутки голову ломаю, но походу всетаки блондинка.
Пожалуйста.
хттп://live.cnews.ru/forum/index.php?showtopic=18635
fld d; загоняем в сопроцессор переменную - вещ.число
fsqrt; извлечение корня
fst d; загоняем результат в переменную - вещ.число
Flame of Soul
тебе мат. алгоритм или функия?
блин, интересно стало, Ньютон тоже думал, типа
"Мля уже сутки думаю как извлечь квадратный корень, до сих пор не придумал. Может я блондинко?"
если мат алгоритм, то посмотри на википедии статью про метод Ньютона. Готовой функциии там нет, так что реализация на твое усмотрение.
кульный мат. алгоритм для асма - разложение функции корень из икс в ряд Маклорена ))))
Подскажите новычГу! Есть много версий асм'а как я понял (Tasm, Masm, Fasm). Как разобраться в них?
Подскажите новычГу! Есть много версий асм'а как я понял (Tasm, Masm, Fasm). Как разобраться в них?
Книжки читать ... Иначе не знаю. Только вот с Тасмом не стоит рабираться, т.к. его уже давно Борланд забросил.
Книжки читать ... Иначе не знаю. Только вот с Тасмом не стоит рабираться, т.к. его уже давно Борланд забросил.
Чем различаются они? Производителями?
dinar_007
11.01.2008, 17:05
Чем различаются они? Производителями?
Диалектом...
Great: фонетикой, епт..
Диалектом...
Может синтаксисом? А так спасибо! Терь понял!
Может синтаксисом? А так спасибо! Терь понял!
Синтаксисом самих команд - не особо. В основном средствами создания макросов и директивами
De-visible
16.01.2008, 16:47
Как перевести код с делфи на ассемблер и убрать лишнее? Не подскажете???!!!
De-visible Ну я думаю автоматических прог для перегонки с одного языка на другой врядли найти, поэтому чтобы это сделать нужно знать и ассемблер и делфи...
Если код небольшой, то можешь на форуме попросить... :)
De-visible
16.01.2008, 20:18
Я слышал что delphi автоматически генерирует код...(на Ассемблер)
De-visible Так любой компилятор генерирует код в машинный )
Чуть не понятно тебя...
Если тебе в делфе нужно асм вставки, то юзай директивы
asm
mov eax, eax
end;
De-visible
16.01.2008, 20:36
Сам себя чуть не понял....
ты говоришь любой генерирует! так значит он переводит!
Только как просмотреть!
Именно код моей проги чтобы ничего лишнего!
GoreMaster
16.01.2008, 20:37
Только как просмотреть!
В отладчике
De-visible
16.01.2008, 20:46
там вообще ужас!
это не то!
к примеру :
i:=2;
c:=i;
компилер делфи выделит блок памяти(в 4 байта для каждой переменной i и c)
после чего сгенерит следующий код в представлении ассемблера:
[QUOTE]
mov [04440001],2 //04440001-блок памяти под переменную "i","с" записанным в него значением
xchg [04440001], [04440005] //Первое значение адрес памяти с переменной i а второе с переменной "с",после чего переменной "с" происходит назначение значения которое содержиться в переменной i.
А по другому никак.
попробуй IDA - интерактивный дизассемблер,он в состоянии генерировать код,который может быть скомпилирован TASM.
Помогите пожалуйста:
Присвоить в AX какое-то число.
Подсчитать в BX кол-во нулевых цифр слева.
Пример: AX = 0070h - BX => 2
+ всем кто как-нибудь поможет ;) заранее спасибо
dinar_007
18.01.2008, 23:48
Помогите пожалуйста:
Присвоить в AX какое-то число.
Подсчитать в BX кол-во нулевых цифр слева.
Пример: AX = 0070h - BX => 2
+ всем кто как-нибудь поможет ;) заранее спасибо
Ох уж этот assembler
Долго вспоминал, какакая команда возвращает номер первого бита слева, который равен единице... bsr :)
mov ax, 0070h
bsr bx, ax
jnz @lab0:
mov bx, 4
jmp @lab1:
@lab0:
shr bx, 2
@lab1:
shr bx, 2 эквивалентно bx := bx / 4
mov ax, 0070h
omg. а если там будет 0170h?
dinar_007
19.01.2008, 00:08
omg. а если там будет 0170h?
0170h это 0000000101110000b
команда bsr запишет в bx значение 7, а команда shr bx,2 поделит целочисленно на 4, будет 1
вот только начал читать книжку по асму....первый же исходник не компилируется, ругается на offset message, помогите кто чем может :)
.model small
.stack 100h
.code
start: mov ax,DGROUP
mov ds,ax
mov dx,offset message
mov ah,9
int 21h
mov ax,4C00h
int 21h
.data
message db "Hello World!",0Dh,0Ah,'$'
end start
p.s. компилятор TASM
Пробуй вместо offset, addr
или
lea dx,message вместо mov dx,offset message
Непонятно почему люди начинают с win16 )))
Delimiter
24.01.2008, 01:57
моделька досовская.... в принцыпе можно было не заморачиваться
а заменить mov на lea и грузить реальный адрес а не смещение.
хочу написать прогу которая выводит текущий ип в плане освоения диалоговых окон.
есть примерно такого вида наработка вызова модального диалогового окна. она находиться в конце, чтобы не мусорить вопрос. вообщем проблема в том что я не могу заставить его работать - оно просто не отображается. те происходит вызов функции и возвращаемое значение равно -1, что не есть гуд.
рассуждения, пожалуй, писать не буду, а то уже наученный горьким опытом знаю что там будет бред.
вообщем они самые наработки.
жаль что приатачить нельзя, но думаю в ресурсах ошибки быть не должно, так что их не выписываю.
ну и теперь: как это заставить работать?
.386
.model flat,stdcall
option casemap:none
DlgProc proto :DWORD,:DWORD,:DWORD,:DWORD
include \masm32\include\windows.inc
include \masm32\include\user32.inc
include \masm32\include\kernel32.inc
includelib \masm32\lib\user32.lib
includelib \masm32\lib\kernel32.lib
.data
DlgName db "MyDialog",0
AppName db "First",0
.data?
hInstance HINSTANCE ?
.const
MyDialog equ 101
IDC_IPADDRESS1 equ 1000
IDM_EXIT equ 32003
.code
start:
invoke GetModuleHandle, NULL
mov hInstance,eax
invoke DialogBoxParam, hInstance, ADDR DlgName,NULL, addr DlgProc, NULL
invoke ExitProcess,eax
DlgProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM
.IF uMsg==WM_INITDIALOG
invoke GetDlgItem, hWnd,IDC_IPADDRESS1
invoke SetFocus,eax
.ELSEIF uMsg==WM_CLOSE
invoke SendMessage,hWnd,WM_COMMAND,IDM_EXIT,0
.ENDIF
mov eax,TRUE
ret
DlgProc endp
end start
TruPAC При вызове функции
invoke DialogBoxParam, hInstance, ADDR DlgName,NULL, addr DlgProc, NULL
DlgName - не должен быть DlgName db "MyDialog",0 Это индетификатор описания окна, который по идеи храниться в ресурсе, также как и IDC_IPADDRESS1...
По идеи у тебя уже обьявлен индетификатор окна
.const
MyDialog equ 101
IDC_IPADDRESS1 equ 1000
IDM_EXIT equ 32003
Русурсы ты не выложил, поэтому можно предпологать, что с ними все ок! Поэтому есть вариант попробывать так...
invoke DialogBoxParam, hInstance, MyDialog ,NULL, addr DlgProc, NULL
Окно должно создасться с условием если описание окна в ресурсах соответствует спецификациям :)
Flame of Soul
06.02.2008, 11:32
Приветики, у меня есть вопросик, но сначала обрисую ситуацию.
Сидела я как то вечером перед монитором и решила написать свою маленькую ось, дабы закрепить азы асемблера. А сама блондинка блондинкой в этом. Взяла копы книжек в королевстве дежавю и замке пдф. Сходила к старцу васму. Послала гонцов в гугль. В итоге написала загрузчика (конечно же на дискетку((((). Написала ядро для нее. Теперь вопрос (простите Выпросы:)
у меня с загрузчика на ядро управление передаеться :
jmp 0800h:0000h
да кстати ось работает в текстовом режиме 80х25
mov ah, 00h
mov al, 03h
int 10h
собственно вопрос вот в чем:
когда я ввожу команду, она идет на выполнение, вот пример:
chelp db "help", 0
chelp_tail:
......
help_msg db "тут приветствие", 0Dh,0Ah,0
......
......
lea si, command_buffer
mov cx, chelp_tail - offset chelp ; size of ['help',0] string.
lea di, chelp
repe cmpsb
je help_command
......
......
; +++++ 'help' command ++++++
help_command:
; scroll text area 11 lines up:
mov al, 11
call scroll_t_area
; set cursor position 11 lines
; above prompt line:
mov ax, 40h
mov es, ax
mov al, es:[84h]
sub al, 11
gotoxy 0, al
lea si, help_msg
call print_string
mov al, 1
call scroll_t_area
jmp processed
Как сделать так чтобы при вводе команды, допустим "tasm" у меня запускался внешний файл "exe" or "com" любой. То есть независимо от адресного пространства?
Я не знаю как назвать это, ну то есть чтобы можно было осуществить выход за пределы ядра, как бы мультизадачность.
это не ОС никакая...
по4ему под 16разрядн. пишем? проще под винь и invoke ShellExecute
Flame of Soul
07.02.2008, 00:20
по4ему под 16разрядн. пишем? проще под винь и invoke ShellExecute
))) блин а я то дура думала, есив я загружаюсь с дискетки, меня приветствует загрузчик, потом появляеться приветствие ОС и в итоге я могу выполнять некоторые команды - это однозадачная ос, а оказываеться нет, да при том она и 16 разрядная? какая досада((( не гони. Есив это написано и откомпиленно не на тасме и не на масме то это не значит что это 16 разрядный асемблер.
вопрос был другой как с ядра обращаться к посторонним файлам.
Delimiter
07.02.2008, 00:34
А Dos и есть и был однозадачный. Там и ядра то не было.... и у тебя не будет! Есть БИОС таблица прерываний.....часть БИОСА часть под Dos заточена....там все есть,что тебе нужно! А грузится все энто бизобразие в единое адресное пространство 640Килобайт 8)).. соответственно расслабься грузи программу в память определяй точку входа и передавай управление.
Или "вытесняющая многозадачность"мастдая вьелась в моск?
А вообще мадам.... вы похоже идете в сторону MBR вируса... дык зайдите на lab29a... возьмите лучший образец и "думайте" ....там то управление передается на оригинальный загрузчик.
Flame of Soul
07.02.2008, 02:38
зайдите на lab29a... возьмите лучший образец и "думайте"
это я все просматрела. На счет доса и много задачности.
Я в замешательстве. Есть разница между графическим и текстовым режимом?
а то вот тут я наблюдаю много задачность Manuet OS v0.78.;)
под Fat 12 так е на флопике. Имеет возможность запускать файлы и работать с ними не зависимо от адресного пространства. И там и у меня система 32-х битная.
Со всей симпатией за помощь в развитии моих знаний Delimiter но как это понимать?
А Dos и есть и был однозадачный. Там и ядра то не было.... и у тебя не будет!
Как раз таки через прерывание эти действия и производяться, вот только я пока не могу понять как.
PS: DOS -дисковая операционная система, не все они однозадачные:-)
Многозадачная, многопользовательская операционная система DOS-Line
В реальном режиме мы имеем 640Kb памяти - 10 сегментов по 64Kb. В первый сегмент лучше не соваться - эта область BIOS. Для простоты предположим, что каждая задача нашей ОС - это COM файл MS-DOS.
COM-программы содержат единственный сегмент (или, во всяком случае, не содержат явных ссылок на другие сегменты). Образ COM-файла считывается с диска и помещается в память, начиная с PSP:0100. Притом COM-программа может использовать множественные сегменты, но она должна сама вычислять сегментные адреса, используя PSP как базу.
В MS-DOS после загрузки двоичного образа:
CS, DS, ES и SS указывают на PSP
SP указывает на конец сегмента PSP (обычно 0fffeH, но может быть и меньше, если полный 64K сегмент недоступен). Слово по смещению 06H в PSP указывает, какая часть программного сегмента доступна.
Вся память системы за программным сегментом распределена программе.
Слово 00H помещено (PUSH) в стек.
IP содержит 100H (первый байт модуля) в результате команды JMP PSP:100
задача при загрузке файла проделать те-же самые действия, что-бы программы ни коим образом не догадывалась об отстутствии ее родной ОС.
Предположим, что каждая COM-программа занимает в памяти один сегмент.
18.2 раза в секунду приходит аппаратное прерывание, и процессор отвлекается на выполнение некоторой процедуры - восьмого прерывания (int 08h). При этом он сохраняет в стеке регистр флагов (PUSHF), и регистры указывающие на текущую команду (CS:IP) (PUSH CS, PUSH IP). Всего 6 байт. После окончания аппаратного прерывания эти регистры восстанавливаются и основная программа продолжает свое выполнение.
Задача, состоит в том, чтобы во время выполнения прервания подменять стек таким образом, что-бы после восстановления регистров выполнялась другая программа, находящаяяся в памяти.
При наилучшем раскладе возможна загрузка восьми задач - 640Kb/64Kb=10, то есть всего имеем десять сегментов - один под переменные DOS, и один под ядро, вот и остается только восемь.
так ничего и не удалось разобрать самому. могу разве что сослаться но постоянную смену редакторов ресурсов каждым из которых двигала мания величия в виде вставки своих копирайтов в коментах и юзанием хз каких библиотек. вообщем на данный момент остановился на ResEd. поскольку у мене не получилось самому то остается один очень надежный вариант. ткните меня носом в правильны ответ.
вот полный текст и программы и ресурсов.
.386
.model flat,stdcall
option casemap:none
DlgProc proto :DWORD,:DWORD,:DWORD,:DWORD
include \masm32\include\windows.inc
include \masm32\include\user32.inc
include \masm32\include\kernel32.inc
includelib \masm32\lib\user32.lib
includelib \masm32\lib\kernel32.lib
.data
;DlgName db "MyDialog",0
AppName db "First",0
.data?
hInstance HINSTANCE ?
.const
IDM_EXIT equ 32003
IDD_DLG2 equ 1000
IDC_RED1 equ 1001
.code
start:
invoke GetModuleHandle, NULL
mov hInstance,eax
invoke DialogBoxParam, hInstance, IDD_DLG2, NULL, ADDR DlgProc, NULL
invoke ExitProcess,eax
DlgProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM
.IF uMsg==WM_INITDIALOG
invoke GetDlgItem, hWnd, IDC_RED1
invoke SetFocus,eax
.ELSEIF uMsg==WM_CLOSE
invoke SendMessage, hWnd, WM_COMMAND, IDM_EXIT, 0
.ENDIF
mov eax,TRUE
ret
DlgProc endp
end start
#define IDD_DLG2 1000
#define IDC_RED1 1001
IDD_DLG2 DIALOGEX 5,5,65,13
CAPTION "IDD_DLG"
FONT 10,"MS Sans Serif",400,0,204
STYLE 0x10CF0000
BEGIN
CONTROL "IDC_RED",IDC_RED1,"RichEdit20A",0x50010000,1,1,63,11,0x00000200
END
Сразу приношу извенения я только начал изучать языки програмирования не считая скриптов. Решил начать с асемблера.
Посоветте с чего мне начать? где скачать програмное обеспечение для написания программ на асемблере?
я скачал с http://softok.org/coding/debug/13111prog.html Turbo Assembler Shell v.3.00
пробывал запустить простенький код
.data
msgtext db "Hello, WORLD", 0h
msgcap db "It is ASM!!! =)", 0h
.code
start:
INVOKE MessageBoxA, 0 offset msgtext, offset msgcap, 0
end start
конечно же неполучилось в ошибке пишут
Оut-file not found
какого выходного файла нету я понять немогу. вроде перед запуском проект сохранил.
посоветте пожалусто чтонибть для совсем зелёных. заранее благодарен
ZET36
DlgProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM
.IF uMsg==WM_INITDIALOG
invoke GetDlgItem, hWnd, IDC_RED1
invoke SetFocus,eax
.ELSEIF uMsg==WM_CLOSE
invoke EndDialog, hWndn, 0
.ENDIF
xor eax, eax
ret
DlgProc endp
Оконная процедура должна возвращать НОЛЬ. + по событию WM_CLOSE закрываем диалог.
CONTROL "IDC_RED",IDC_RED1,"RichEdit20A",0x50010000,1,1,63,11,0x00000200 - тут что-то неправильно!!!
Для примера попробуй заменить на
CONTROL "IDC_RED",IDC_RED1,"edit",0,1,1,63,11
Софт для асма бери на WWW.WASM.RU -> предпочтительно MASM or FASM.
ZET36
думаю для совсем зеленых подойдет вот этот вариант. если что то непонятно могу откоментировать. вот тут прямая ссылка на MASM. в нем я компилировал чего и вам желаю. http://wasm.ru/baixado.php?mode=tool&id=48
.386
.model flat,stdcall
option casemap:none
include \masm32\include\user32.inc
include \masm32\include\kernel32.inc
include \masm32\include\windows.inc
includelib \masm32\lib\user32.lib
includelib \masm32\lib\kernel32.lib
.data
msgtext db "Hello, WORLD", 0h
msgcap db "It is ASM!!! =)", 0h
.code
start:
invoke MessageBox, NULL, addr msgtext, addr msgcap, MB_OK
invoke ExitProcess, NULL
end start
GlOFF
хм.. где же в листинге вы нашли процедуру окна? я наконецто по лазил под отладчиком и наткнулся на то что при вызове диалоговой процедуры сначала ищется ресурс, если он не находится, то и не происходит вызова DialogBoxParam что и происходит у меня. вообщем посмотрел у Iczelion'a и нашел что у него имя ресурса задается ASCI-zero строкой. вообщем это внесло еще больше сумятицы в то что вы сказали что так нельзя. вы не могли бы довести проект до рабочего состояния, если вас не затруднит?
TruPAC Вот так попробуй компильнуть ->
.386
.model flat,stdcall
option casemap:none
DlgProc proto :DWORD,:DWORD,:DWORD,:DWORD
include \masm32\include\windows.inc
include \masm32\include\user32.inc
include \masm32\include\kernel32.inc
includelib \masm32\lib\user32.lib
includelib \masm32\lib\kernel32.lib
.data
AppName db "First",0
.data?
hInstance HINSTANCE ?
.const
IDM_EXIT equ 32003
IDD_DLG2 equ 1000
IDC_RED1 equ 1001
.code
start:
invoke GetModuleHandle, NULL
mov hInstance,eax
invoke DialogBoxParam, hInstance, IDD_DLG2, NULL, ADDR DlgProc, NULL
invoke ExitProcess,eax
DlgProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM
.IF uMsg==WM_INITDIALOG
invoke GetDlgItem, hWnd, IDC_RED1
invoke SetFocus,eax
.ELSEIF uMsg==WM_CLOSE
invoke EndDialog, hWndn, 0
.ENDIF
xor eax, eax
ret
DlgProc endp
end start
+
#define IDD_DLG2 1000
#define IDC_RED1 1001
IDD_DLG2 DIALOGEX 5,5,65,13
CAPTION "IDD_DLG"
FONT 10,"MS Sans Serif"
STYLE 0x10CF0000
BEGIN
CONTROL "IDC_RED",IDC_RED1,"edit",0,1,1,63,11
END
TruPAC DlgProc - оконная\диалоговая процедура, обслуживает сообщения приходящие к данному диалогу. Просто щас сравни листинги и найди что изменилось.
ё маё... ну сколько ж можно... и так тоже не работает. вроде бы все нормально - проверял на чужих исходниках и все прекрасно собирается, а тут нет. у вас это точно собирается? мб ошибка не только у меня? не обижайтесь, а вдруг? вы можете приатачить файлы? я уже просто с ума схожу - 6 дней возни на стенке кашей и толку 0.
Ps
я всегда различал оконную и диалоговую процедуры.
TruPAC Вот мой рабочий\компилируемый вариант ->
http://webfile.ru/1737398
GlOFF
огромное спасибо! оказывается ошибка была в том что по какимто причинам мой линкер собирал новый вариант в папку общих документов и вместо того чтобы получить новый exe я работал со старым. сейчас я непременно посмотрю ваш вариант.
гуру и не гуру,дайте пожалуйста консольный пример "Hello, Wolrd" на асме,а то обыскался уже. :)
wasm.ru/article.php?article=1022006
wasm.ru/article.php?article=1022006
я до этого этот исходник компилил,но ничего не работало...оказалось дело в ключе /SUBSYSTEM:CONSOLE :) но все равно спасибо)
нужно написать прогу:создается файл(file1.txt) и туда из уже существуещего файла к примеру file.txt копируется текст. Написать нужно на апи используя асм. я раньше программировал на асм для контроллеров чуть-чуть, а с API познакомился совсем недавно так что не гнобите если немного чушь :)
.386
.model flat, stdcall
option casemap:none
include \masm32\include\windows.inc
include \masm32\include\user32.inc
include \masm32\include\kernel32.inc
include \masm32\include\comdlg32.inc
includelib \masm32\lib\user32.lib
includelib \masm32\lib\kernel32.lib
includelib \masm32\lib\comdlg32.lib
.const
MEMSIZE equ 65535
.data
memor DB "d:\file.txt"
file_name DB "d:\file1.txt",0
.data?
hFile HANDLE ?
hMemory HANDLE ?
pMemory DWORD ?
SizeReadWrite DWORD ?
param HANDLE ?
.code
start:
invoke OpenFile,ADDR memor,NULL,OF_READWRITE
mov param,eax
invoke CreateFile,ADDR file_name,\
GENERIC_READ or GENERIC_WRITE ,\
FILE_SHARE_READ or FILE_SHARE_WRITE,\
NULL,OPEN_EXISTING,FILE_ATTRIBUTE_ARCHIVE,\
NULL
mov hFile,eax
invoke GlobalAlloc,GMEM_MOVEABLE or GMEM_ZEROINIT,MEMSIZE
mov hMemory,eax
invoke GlobalLock,hMemory
mov pMemory,eax
invoke SendMessage,param,WM_GETTEXT,MEMSIZE-1,pMemory
invoke WriteFile,hFile,pMemory,MEMSIZE,ADDR SizeReadWrite,NULL
invoke CloseHandle,hFile
invoke GlobalUnlock,pMemory
invoke GlobalFree,hMemory
end start
нужно написать прогу:создается файл(file1.txt) и туда из уже существуещего файла к примеру file.txt копируется текст
Проще всего так:
.386
.model flat, stdcall
option casemap:none
include \masm32\include\kernel32.inc
includelib \masm32\lib\kernel32.lib
.data
memor DB "d:\file.txt",0
file_name DB "d:\file1.txt",0
.code
start:
invoke CopyFile, offset memor, offset file_name, 1
invoke ExitProcess, 0
end start
Не получается ассемблировать с MASM611
При написании в ком. строку
> ML.EXE PROG.ASM /AT
получаю следующую ошибку:
Assembling PROG.ASM
fatal error A1000: cannot open file : PROG.ASM
Так же пробовал и на TASM
> TASM.EXE PROG.ASM
вот что получаю
**Fatal** Command line: Can't locate file PROG.ASM
file PROG.ASM находится в той же папке где и ML.EXE .
Код взял с книги Калашникова.
Кто поможет в чём проблема?
Delimiter
04.03.2008, 22:56
ну допустип.... path на ML и TASM прописаны.....
а не проще прописать полные маршруты к "сырцам"?
ML Fatal Error A1000
cannot open file: filename
The assembler was unable to open a source, include, or output file.
One of the following may be a cause:
The file does not exist.
The file is in use by another process.
The filename is not valid.
A read-only file with the output filename already exists.
The current drive is full.
The current directory is the root and is full.
The device cannot be written to.
The drive is not ready.
читаю книжку :
"Ввод на уровне Bios:
для непосредственного ввода с клавиатуры используют прерывание int 16h ... "
я не совсем понял про прерывания в защищённом режиме ....возможно читать из под обычного NT ? ( если да - то можно пример кода? )
Delimiter
04.03.2008, 23:20
Нет.... низя там стоят "заглушки".... книжка явно заточена по ДОС!
... хотя если програмка запускается как DOS приложение под NT то туда кладутся псевдопрерывания(для совместимости) указывающие на "обработчики" нестандарта. Почему псевдо??? Потому что они так же хукаются :D
Jes, в винде всё - только через дрова, вроде... Ни int'ы аппаратные, ни in/out... Но где-то была библиотека, которая позволяет юзать их под виндой. Если надо - посмотри в гугле, если не найдёшь - спроси - посмотрю - у меня где-то валяется...
Взялся немножко Асм по ночам учить, книгу использую Пирогова В.Ю. он транслирует проги при помощи masm.exe, но в моей версии masm.exe не наблюдается, есть ml.exe и link.exe. Суть в том что листинги прог из книги, ml.exe транслирует с ошибками и собсно ничего не получается.. Как быть? Мож есть другие книги по изучению Асма под новые версии MASM-а?
транслировал с параметрами ml /c /coff first.asm
Взялся немножко Асм по ночам учить, книгу использую Пирогова В.Ю. он транслирует проги при помощи masm.exe, но в моей версии masm.exe не наблюдается, есть ml.exe и link.exe. Суть в том что листинги прог из книги, ml.exe транслирует с ошибками и собсно ничего не получается.. Как быть? Мож есть другие книги по изучению Асма под новые версии MASM-а?
транслировал с параметрами ml /c /coff first.asm
Там Дос или Вин32?
Dos
тогда компиль с флагом /AT
ml /c /AT first.asm - команда проканала
link /SUBSYSTEM:CONSOLE first.obj - ругаца..
warning LNK4033: converting object format from OMF to COFF
fatal error LNK1190: invalid fixup found, type 0x0001
вот кодес:
;---------------------------------
TITLE PRIMER11
;---------------------------------
CODSEG SEGMENT
ASSUME CS:CODSEG, DS:CODSEG, SS:CODSEG, ES:CODSEG
ORG 100H
BEGIN:
JMP BEG_CODE
TEXT DB 'My first program on assembler. $'
BEG_CODE:
MOV AX,CS
MOV DS,AX
LEA DX,TEXT
MOV AH,9
INT 21H
MOV AH,4CH
INT 21H
CODSEG ENDS
END BEGIN
есть процедура на асме которая выставляет частоту микросхемы таймера.
____________________________________________
SetTimeFraq Proc
ARG freq:word
push bp
mov bp,sp
mov al, 36h
out 43h,al
jmp $+2
mov ax, freq
out 40h,al
jmp $+2
xchg al,ah
out 40h, al
pop bp
ret
SetTimeFraq EndP
____________________________________________
Вопрос: почему для задержки при переходе к след. инструкции используется JMP $+2 (а не nop или друг.) :confused:
В асме поке не силен так что сильно не ругайте)
потому что $ - адрес команды jmp, команда занимает 2 байта (short), + 2 переход на следующую команду (mov ax, freq),
можно очевидно в данном случае nop также использовать
[']потому что $ - адрес команды jmp, команда занимает 2 байта (short), + 2 переход на следующую команду (mov ax, freq),
можно очевидно в данном случае nop также использовать
Да на самом деле не особо понятно, зачем вообще ждать...
Да на самом деле не особо понятно, зачем вообще ждать...
На сколько я понял все таки нужно ждать, потому что:
каждый из 3-х каналов микросхемы таймера i8253 (i8254) состоит из 3-х регистров. Доступ к каждой группе регистров осуществляется через 1 порт (номера портов от 40h до 42h соответственно каналам 0-2).
Порт связан с 8-битн регистром ввода/вывода. Через порт отправляется 2-байтн значение (с младш байта) которое сохраняется в 16 битн регистре.
ИМХО) по ходу задержка для того чтоб в 2 этапа протолкнуть 16 битн значение через 8 битн порт.
если не прав помогите понять что к чему)
nop использовать не стоит, т.к. jmp short занимает куда больше тактов процессора
Ждать надо, что бы успела обработать аппаратура. Только не надо спрашивать конкретнее - что куда там обработать, как микросхема пашет и пр. - я хз.
ребят, у меня мандрива линукс 2007.
скажите пожалуйста что нужно установить и сделать, чтобы скомпилить самую примитивную прогу на ассемблере? чтоб проще неё уже ниче придумать нельзя было.
какие пакеты нужны?
редактор? (вима хватит?)
исходный код (в его содержимом после разберусь)
как компильнуть и запустить?
2Дикс
nasm
http://linux.softpedia.com/get/Programming/Compilers/NASM-The-Netwide-Assembler-643.shtml
nasm manual
http://nasm.sourceforge.net/doc/nasmdoc0.html
скачать фасм под линукс там в примерах всё написано
(я недавно в асме):
... компилит нормально , но при запуске пишет "точка входа в процедуру CreateFile не найдена в библиотеке Kernel32.dll" ( fasm , ps: а масме всё нормально)
:
format Pe GUI 4.0
entry main
include 'C:\fasm\Include\win32a.inc'
DO_NOT_SHARE equ 0
OPEN_EXISTING equ 3
GENERIC_WRITE = 40000000h
FILE_ATTRIBUTE_NORMAL = 80h
...
main:
push 0
push FILE_ATTRIBUTE_NORMAL
push OPEN_EXISTING
push 0
push DO_NOT_SHARE
push GENERIC_WRITE
push filename
call dword [CreateFile]
...
section '.data' readable writable
filename db 'log.txt',13,10,0
section '.idata' data import readable writable
library kernel32,'kernel32.dll'
import kernel32,\
CreateFile,'CreateFile'
...
:(
Потому что CreateFileA
PS У меня в статье - пример использования :)
Закрепленные темы по языкам созданы для вопросов по СИНТАКСИСУ,
ps: а учить полезно и то и то :)
А где можно компилятор Masm?
А где можно компилятор Masm?
tyt (http://wasm.ru/baixado.php?mode=tool&id=48)
А каким компилятором лучше пользоваться новичку?
А каким компилятором лучше пользоваться новичку?А ты под какой операционкой то? вынь?
лучше конечно пока ты осваиваешь юзать то что описано в доках, а потом когда будет опыт выберешь что тебе подходит.
Под виндос и дос , но масм у меня не устанавливается :(
De-visible
06.04.2008, 18:59
Установи себе emu8086 и радуйся жизни:)
Я установил себе ФАСМ
Масм и Фасм это не одно и тоже.
Да , я знаю , но и тот и другой отказываются компелить код
CSEG segment
org 100h
Begin:
mov ah,9
mov dx,offset Message
int 21h
int 20h
Message db 'Hello, world!$'
CSEG ends
end Begin
Код взят из Калашникова я проблему не понимаю , а компел просто показывает что в этом коде ошибка.
Flame of Soul
07.04.2008, 00:18
Да , я знаю , но и тот и другой отказываются компелить код
CSEG segment
org 100h
Begin:
mov ah,9
mov dx,offset Message
int 21h
int 20h
Message db 'Hello, world!$'
CSEG ends
end Begin
Код взят из Калашникова я проблему не понимаю , а компел просто показывает что в этом коде ошибка.
для Manoff (http://allbasse.narod.ru/)
код работает , компилировала в emu8086 (http://emu8086.com)
Да , я знаю , но и тот и другой отказываются компелить код
Естественно некомпилится.. Это из-за несовместимости трансляторов! Ассемблер - это не только мнемоники, но еще и синтаксис транслятора: макросы, дерективы и тд, и тп
Просто даже среди ассемблеров одного типа большой разброд: различие в ключевых словах, в правилах оформления листинга, библиотеках, хидерах..
Тоесть чтобы скомпилировать код Калашникого, тебе нужно переделать его под свой компилятор.. Ты выбрал FASM.. ну так бери справочники и туторы по нему..
А твой код на fasm будет выглядить так:
org 100h
use16
mov ah,9
mov dx,hello
int 21h
int 20h
hello db 13,10,'Hello,world$'
KindEcstasy
07.04.2008, 22:18
Manoff
Приучай себя сразу записывать числа не просто 9 а например 09h просто правило хорошего тона. конечно по дефолту асм знает что это hex - но всё же...
Да я уже понял , все отладчики в hex'е работают , но не все пишут h в конце =)), я так пару раз лохонулся .
TAHA я уже покопался и нарыл статьи об особенностях , спасибо.
А справочника по прерываниям и командам процессора у кого-нить есть?
Manoff брось ты уже Калашникова читать, его книга и рассылка была актуальна лет эдак 12 назад!!!!
Думаю ты врядли будешь писать резидента под DOS...
Скачай уроки изелона с wasm.ru и хотябы что-нибудь из этого списка:
Язык ассемблера для процессоров Intel - Ирвин
Искусство программирования на АССЕМБЛЕРЕ - Н. Голубь
Ассемблер для процессоров Intel - Ю. Магда
Изучаем Ассемблер - А.Б. Крупник.djvu
И у тебя возникнет меньше проблем..
TAHA +1
Manoff Александр Крупник "САМОУЧИТЕЛЬ ASSEMBLER" -> СКАЧАТЬ (http://www.inattack.ru/download/krupnik_izuchaem_assembler.rar)
vBulletin® v3.8.14, Copyright ©2000-2026, vBulletin Solutions, Inc. Перевод: zCarot