![]() |
|
|
![]()
|
|
| Slava |
|
|||
|
Unregistered |
Я новичок в программировании, увлекся совсем недавно. Сначала пробовал языки программирования высшего уровня, но вскоре понял, что то чего я хочу заключается в ассемблере. Но постоянно возникают проблемы : то не могу узнать команды для компиляции, то компоненты MASM32 не чвляются приложением WIN32 и т. д. и т. п. Вобщем вопросов полно, так что подскажите где розузнать о ассемблере побольше.
|
|||
|
||||
| Payne |
|
|||
![]() Детектив ![]() Профиль Группа: Участник Сообщений: 247 Регистрация: 6.4.2005 Где: Петербург Репутация: нет Всего: 10 |
Вам нужно прогить под Win32 или под ДОС? Если под ДОС, то начинайте с уроков по Асму в этом разделе (их дает Chingachguk). Если под Win32, обратитесь на сайт wasm.ru. Там можно скачать оффлайн архив статей сайта, в котором можно найти уроки по Win32 Assembler Icezelion'а.
|
|||
|
||||
| Slava |
|
|||
|
Unregistered |
На Wasm.ru советуют скачать Masm32, я скачал написал текст проги, пишу
ml /с /coff /Cp winurl.asm link winurl.obj /subsystem:windows а мне выдает, что ml.exe не является приложением WIN32:( |
|||
|
||||
| Payne |
|
|||
![]() Детектив ![]() Профиль Группа: Участник Сообщений: 247 Регистрация: 6.4.2005 Где: Петербург Репутация: нет Всего: 10 |
Раз вы скачали Masm32, то я так понимаю, что программируете вы под Windows.
Все, что я могу сейчас сделать, это объяснить пошагово, что нужно делать вообще, хотя советовал бы вам скачать архив статей Wasm.ru (он весит 10 мегабайт Итак, вы написали исходник своей программы. Сохраняйте ее, к примеру, в папке drive:\masm32\work под именем MyProg.asm (обязательно расширение asm), где drive - привод, где у вас стоит masm32. Теперь запускайте командную строку. В ней переходите (с помощью команды cd) в каталог drive:\masm32\work, где, собсно, и лежит сырец. Пишете в командной строке следующее (будем считать, что ассемблер стоит у вас на диске C): c:\masm32\bin\ml /c /coff /Cp MyProg.asm Ключ /c говорит о том, что мы хотим только оттранслировать прогу, но не компоновать. Ключ /coff обозначает, что мы создаем объектный файл в формате COFF, стандартном для Windows. Насчет /Cp не совсем помню: вроде он отвечает за сохранение регистра имен, созданных пользователем, но это не суть важно... Это был этап трансляции, то бишь создания объектного файла. Если все прошло хорошо, то в каталоге c:\masm32\work должен появиться файл MyProg.obj. Его будем линковать следующей командной строкой: c:\masm32\bin\link /SUBSYSTEM:WINDOWS /LIBPATH:c:\masm32\lib MyProg.obj Ключ /SUBSYSTEM указывает подсистему, для которой мы создаем exe-шник. В нашем случае Винды. /LIBPATH - это путь к библиотекам, подключаемым в вашей программе (команды includelib и include). Это обязательно, так в прогах для Windows используется минимум, состоящий из библиотеки kernel32.lib. Итак, в папке ...\work должен появиться exe-шник. З.Ы. То, что здесь написано, должно привести к созданию exe-шника. Я ведь так делаю. А работаю я под WindowsXP, и тем не менее нет такой байды:
|
|||
|
||||
| Slava |
|
|||
|
Unregistered |
Наверное покажется глупым вопрос, но в с:\masm32\ папки work нет ив помине
А за исчерпывающий ответ спасибо |
|||
|
||||
| oleg1973 |
|
|||
![]() asm fanat ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 3283 Регистрация: 16.7.2003 Где: Italy Репутация: нет Всего: 34 |
рекомендация
исползуйте Fresh IDE+Fasm настраиват ниче не нада все настроено проект выгядит так
компилируется 1 кнопкой все -------------------- SST 465555 icq 200-512-712 |
|||
|
||||
| Payne |
|
|||
![]() Детектив ![]() Профиль Группа: Участник Сообщений: 247 Регистрация: 6.4.2005 Где: Петербург Репутация: нет Всего: 10 |
Ее должны создать вы сами! Это просто для удобства. То есть все ваши проекты во время обучения будете хранить в папке c:\masm32\work. Да, я ее явно не указал в своем "объяснении", извините. А так вообще вы можете вместо work юзать любой другой каталог. От этого только меняются пути при компиляции. |
|||
|
||||
| Slava |
|
|||
|
Unregistered |
Чтото ни чего не появляется, попробую другую прогу написать
|
|||
|
||||
| Payne |
|
|||
![]() Детектив ![]() Профиль Группа: Участник Сообщений: 247 Регистрация: 6.4.2005 Где: Петербург Репутация: нет Всего: 10 |
Может, запостите здесь прогу, которую вы писали? Если в ней ошибка, то я, возможно, смогу подсказать, в чем она заключается. |
|||
|
||||
| Wowa |
|
|||
|
Эксперт Профиль Группа: Админ Сообщений: 15017 Регистрация: 14.9.2000 Где: Винград Репутация: нет Всего: 290 |
Модератор: Название темы должно отражать ее суть!
|
|||
|
||||
| Guest |
|
|||
|
Unregistered |
Ну допустим вот, исходник с сайта без изменений, когда пытась следовать Вашим указаниям на доли секунды высвечивается окно типа MS-DOS и тухнет, а в папке ичего не появляется
Должно быть вращение куба (3D) ;==============================================================================; ; ; ; Assembler Program By Vulture. ; ; 3D-system example. Use the following formulas to rotate a point: ; ; ; ; Rotate around x-axis ; ; YT = Y * COS(xang) - Z * SIN(xang) / 256 ; ; ZT = Y * SIN(xang) + Z * COS(xang) / 256 ; ; Y = YT ; ; Z = ZT ; ; ; ; Rotate around y-axis ; ; XT = X * COS(yang) - Z * SIN(yang) / 256 ; ; ZT = X * SIN(yang) + Z * COS(yang) / 256 ; ; X = XT ; ; Z = ZT ; ; ; ; Rotate around z-axis ; ; XT = X * COS(zang) - Y * SIN(zang) / 256 ; ; YT = X * SIN(zang) + Y * COS(zang) / 256 ; ; X = XT ; ; Y = YT ; ; ; ; Divide by 256 coz we have multiplyd our sin values with 256 too. ; ; This example isn't too fast right now but it'll work just fine. ; ; ; ; Current Date: 6-9-95 Vulture ; ; ; ;==============================================================================; IDEAL ; Ideal mode P386 ; Allow 80386 instructions JUMPS ; Tasm handles out of range jumps (rulez!:)) SEGMENT CODE ; Code segment starts ASSUME cs:code,ds:code ; Let cs and ds point to code segment ORG 100h ; Make a .COM file START: ; Main program mov ax,0013h ; Init vga int 10h mov ax,cs mov ds,ax ; ds points to codesegment mov ax,0a000h mov es,ax ; es points to vga lea si,[Palette] ; Set palette mov dx,3c8h xor al,al out dx,al mov dx,3c9h mov cx,189*3 repz outsb ; === Set some variables === mov [DeltaX],1 ; Initial speed of rotation mov [DeltaY],1 ; Change this and watch what mov [DeltaZ],1 ; happens. It's fun! mov [Xoff],256 mov [Yoff],256 ; Used for calculating vga-pos mov [Zoff],300 ; Distance from viewer MainLoop: call MainProgram ; Yep... do it all... in al,60h ; Scan keyboard cmp al,1 ; Test on ESCAPE jne MainLoop ; Continue if not keypressed ; === Quit to DOS === mov ax,0003h ; Back to textmode int 10h lea dx,[Credits] mov ah,9 int 21h mov ax,4c00h ; Return control to DOS int 21h ; Call DOS interrupt ; === Sub-routines === PROC WaitVrt ; Waits for vertical retrace to reduce "snow" mov dx,3dah Vrt: in al,dx test al,8 jnz Vrt ; Wait until Verticle Retrace starts NoVrt: in al,dx test al,8 jz NoVrt ; Wait until Verticle Retrace ends ret ; Return to main program ENDP WaitVrt PROC UpdateAngles ; Calculates new x,y,z angles ; to rotate around mov ax,[XAngle] ; Load current angles mov bx,[YAngle] mov cx,[ZAngle] add ax,[DeltaX] ; Add velocity and ax,11111111b ; Range from 0..255 mov [XAngle],ax ; Update X add bx,[DeltaY] ; Add velocity and bx,11111111b ; Range from 0..255 mov [YAngle],bx ; Update Y add cx,[DeltaZ] ; Add velocity and cx,11111111b ; Range from 0..255 mov [ZAngle],cx ; Update Z ret ENDP UpdateAngles PROC GetSinCos ; Needed : bx=angle (0..255) ; Returns: ax=Sin bx=Cos push bx ; Save angle (use as pointer) shl bx,1 ; Grab a word so bx=bx*2 mov ax,[SinCos + bx] ; Get sine pop bx ; Restore pointer into bx push ax ; Save sine on stack add bx,64 ; Add 64 to get cosine and bx,11111111b ; Range from 0..255 shl bx,1 ; *2 coz it's a word mov ax,[SinCos + bx] ; Get cosine mov bx,ax ; Save it bx=Cos pop ax ; Restore ax=Sin ret ENDP GetSinCos PROC SetRotation ; Set sine & cosine of x,y,z mov bx,[XAngle] ; Grab angle call GetSinCos ; Get the sine&cosine mov [Xsin],ax ; Save sin mov [Xcos],bx ; Save cos mov bx,[Yangle] call GetSinCos mov [Ysin],ax mov [Ycos],bx mov bx,[Zangle] call GetSinCos mov [Zsin],ax mov [Zcos],bx ret ENDP SetRotation PROC RotatePoint ; Rotates the point around x,y,z ; Gets original x,y,z values ; This can be done elsewhere movsx ax,[Cube+si] ; si = X (movsx coz of byte) mov [X],ax movsx ax,[Cube+si+1] ; si+1 = Y mov [Y],ax movsx ax,[Cube+si+2] ; si+2 = Z mov [Z],ax ; Rotate around x-axis ; YT = Y * COS(xang) - Z * SIN(xang) / 256 ; ZT = Y * SIN(xang) + Z * COS(xang) / 256 ; Y = YT ; Z = ZT mov ax,[Y] mov bx,[XCos] imul bx ; ax = Y * Cos(xang) mov bp,ax mov ax,[Z] mov bx,[XSin] imul bx ; ax = Z * Sin(xang) sub bp,ax ; bp = Y * Cos(xang) - Z * Sin(xang) sar bp,8 ; bp = Y * Cos(xang) - Z * Sin(xang) / 256 mov [Yt],bp mov ax,[Y] mov bx,[XSin] imul bx ; ax = Y * Sin(xang) mov bp,ax mov ax,[Z] mov bx,[XCos] imul bx ; ax = Z * Cos(xang) add bp,ax ; bp = Y * SIN(xang) + Z * COS(xang) sar bp,8 ; bp = Y * SIN(xang) + Z * COS(xang) / 256 mov [Zt],bp mov ax,[Yt] ; Switch values mov [Y],ax mov ax,[Zt] mov [Z],ax ; Rotate around y-axis ; XT = X * COS(yang) - Z * SIN(yang) / 256 ; ZT = X * SIN(yang) + Z * COS(yang) / 256 ; X = XT ; Z = ZT mov ax,[X] mov bx,[YCos] imul bx ; ax = X * Cos(yang) mov bp,ax mov ax,[Z] mov bx,[YSin] imul bx ; ax = Z * Sin(yang) sub bp,ax ; bp = X * Cos(yang) - Z * Sin(yang) sar bp,8 ; bp = X * Cos(yang) - Z * Sin(yang) / 256 mov [Xt],bp mov ax,[X] mov bx,[YSin] imul bx ; ax = X * Sin(yang) mov bp,ax mov ax,[Z] mov bx,[YCos] imul bx ; ax = Z * Cos(yang) add bp,ax ; bp = X * SIN(yang) + Z * COS(yang) sar bp,8 ; bp = X * SIN(yang) + Z * COS(yang) / 256 mov [Zt],bp mov ax,[Xt] ; Switch values mov [X],ax mov ax,[Zt] mov [Z],ax ; Rotate around z-axis ; XT = X * COS(zang) - Y * SIN(zang) / 256 ; YT = X * SIN(zang) + Y * COS(zang) / 256 ; X = XT ; Y = YT mov ax,[X] mov bx,[ZCos] imul bx ; ax = X * Cos(zang) mov bp,ax mov ax,[Y] mov bx,[ZSin] imul bx ; ax = Y * Sin(zang) sub bp,ax ; bp = X * Cos(zang) - Y * Sin(zang) sar bp,8 ; bp = X * Cos(zang) - Y * Sin(zang) / 256 mov [Xt],bp mov ax,[X] mov bx,[ZSin] imul bx ; ax = X * Sin(zang) mov bp,ax mov ax,[Y] mov bx,[ZCos] imul bx ; ax = Y * Cos(zang) add bp,ax ; bp = X * SIN(zang) + Y * COS(zang) sar bp,8 ; bp = X * SIN(zang) + Y * COS(zang) / 256 mov [Yt],bp mov ax,[Xt] ; Switch values mov [X],ax mov ax,[Yt] mov [Y],ax ret ENDP RotatePoint PROC ShowPoint ; Calculates screenposition and ; plots the point on the screen mov ax,[Xoff] ; Xoff*X / Z+Zoff = screen x mov bx,[X] imul bx mov bx,[Z] add bx,[Zoff] ; Distance idiv bx add ax,[Mx] ; Center on screen mov bp,ax mov ax,[Yoff] ; Yoff*Y / Z+Zoff = screen y mov bx,[Y] imul bx mov bx,[Z] add bx,[Zoff] ; Distance idiv bx add ax,[My] ; Center on screen mov bx,320 imul bx add ax,bp ; ax = (y*320)+x mov di,ax mov ax,[Z] ; Get color from Z add ax,100d ; (This piece of code could be improved) mov [byte ptr es:di],al ; Place a dot with color al mov [Erase+si],di ; Save position for erase ret ENDP ShowPoint PROC MainProgram call UpdateAngles ; Calculate new angles call SetRotation ; Find sine & cosine of those angles xor si,si ; First 3d-point mov cx,MaxPoints ShowLoop: call RotatePoint ; Rotates the point using above formulas call ShowPoint ; Shows the point add si,3 ; Next 3d-point loop ShowLoop call WaitVrt ; Wait for retrace xor si,si ; Starting with point 0 xor al,al ; Color = 0 = black mov cx,MaxPoints Deletion: mov di,[Erase+si] ; di = vgapos old point mov [byte ptr es:di],al ; Delete it add si,3 ; Next point loop Deletion ret ENDP MainProgram ; === DATA === Credits DB 13,10,"Code by Vulture / Outlaw Triad",13,10,"$" Label SinCos Word ; 256 values dw 0,6,13,19,25,31,38,44,50,56 dw 62,68,74,80,86,92,98,104,109,115 dw 121,126,132,137,142,147,152,157,162,167 dw 172,177,181,185,190,194,198,202,206,209 dw 213,216,220,223,226,229,231,234,237,239 dw 241,243,245,247,248,250,251,252,253,254 dw 255,255,256,256,256,256,256,255,255,254 dw 253,252,251,250,248,247,245,243,241,239 dw 237,234,231,229,226,223,220,216,213,209 dw 206,202,198,194,190,185,181,177,172,167 dw 162,157,152,147,142,137,132,126,121,115 dw 109,104,98,92,86,80,74,68,62,56 dw 50,44,38,31,25,19,13,6,0,-6 dw -13,-19,-25,-31,-38,-44,-50,-56,-62,-68 dw -74,-80,-86,-92,-98,-104,-109,-115,-121,-126 dw -132,-137,-142,-147,-152,-157,-162,-167,-172,-177 dw -181,-185,-190,-194,-198,-202,-206,-209,-213,-216 dw -220,-223,-226,-229,-231,-234,-237,-239,-241,-243 dw -245,-247,-248,-250,-251,-252,-253,-254,-255,-255 dw -256,-256,-256,-256,-256,-255,-255,-254,-253,-252 dw -251,-250,-248,-247,-245,-243,-241,-239,-237,-234 dw -231,-229,-226,-223,-220,-216,-213,-209,-206,-202 dw -198,-194,-190,-185,-181,-177,-172,-167,-162,-157 dw -152,-147,-142,-137,-132,-126,-121,-115,-109,-104 dw -98,-92,-86,-80,-74,-68,-62,-56,-50,-44 dw -38,-31,-25,-19,-13,-6 Label Cube Byte ; The 3d points c = -35 ; 5x*5y*5z (=125) points rept 5 b = -35 rept 5 a = -35 rept 5 db a,b,c a = a + 20 endm b = b + 20 endm c = c + 20 endm Label Palette Byte ; The palette to use db 0,0,0 ; 63*3 gray-tint d = 63 rept 63 db d,d,d db d,d,d db d,d,d d = d - 1 endm X DW ? ; X variable for formula Y DW ? Z DW ? Xt DW ? ; Temporary variable for x Yt DW ? Zt DW ? XAngle DW 0 ; Angle to rotate around x YAngle DW 0 ZAngle DW 0 DeltaX DW ? ; Amound Xangle is increased each time DeltaY DW ? DeltaZ DW ? Xoff DW ? Yoff DW ? Zoff DW ? ; Distance from viewer XSin DW ? ; Sine and cosine of angle to rotate around XCos DW ? YSin DW ? YCos DW ? ZSin DW ? ZCos DW ? Mx DW 160 ; Middle of the screen My DW 100 MaxPoints EQU 125 ; Number of 3d Points Erase DW MaxPoints DUP (?) ; Array for deletion screenpoints ENDS CODE ; End of codesegment END START ; The definite end.... ; You may use this code in your own productions but ; give credit where credit is due. Only lamers steal ; code so try to create your own 3d-engine and use ; this code as an example. ; Thanx must go to Arno Brouwer and Ash for releasing ; example sources. ; ; Ciao dudoz, ; ; Vulture / Outlaw Triad |
|||
|
||||
| Payne |
|
||||||
![]() Детектив ![]() Профиль Группа: Участник Сообщений: 247 Регистрация: 6.4.2005 Где: Петербург Репутация: нет Всего: 10 |
Ни фига себе! Мне кажется, что начинать изучение языка программирования (а тем более Ассемблера) следует начинать с более простых программ (ну, "Hello, world!", к примеру). Ладно, значит так, вырезал я этот сырец, вставил в "Блокнот" и сохранил как proga.asm. Из текста понял, что кодите-то вы все-таки не под Win32, а под DOS! Посмотрите на инструкцию ORG 100h - она говорит компилятору о том, что прога расположится со смещения 0100h, которое и характерно для .com-файлов. Таким образом, при компиляции нужно создавать не .exe, а .com-файл. Следовательно, командные строки
и
здесь использовать просто бессмысленно. Компилировал программу я при помощи (TurboAssembler) TASM 5.0 - уже не помню, где можно скачать, помню, я его в Яндексе за пять минут нашел. Весит около 5 Мб. Для ДОС это, наверное, лучший компилятор. MASM32 и FASM выдавали ошибки еще при ассемблировании, TASM - без проблем откомпилировал, слинковал и запустил! По аналогии, создавайте папку WORK в каталоге TASM, затем копируйте туда четыре файла из папки bin: TASM.exe - транслятор; TLINK.exe - компоновщик; TD.exe - отладчик; RTM.exe - не помню, но в каком-то пособии советовали его тоже копирнуть. Прогу сохраняем в папку WORK. В командной строке переходим в каталог ...\TASM\WORK, транслируем прогу следующей командной строкой: tasm proga.asm В папке появится proga.obj, которую компонуем так: tlink proga.obj /t Ключ /t говорит о том, что при компоновке создается .com-файл. Все! Запускаем .com-файл, результат его выполнения - вертящийся в разные стороны куб, составленный из точек... |
||||||
|
|||||||
| oleg1973 |
|
|||
![]() asm fanat ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 3283 Регистрация: 16.7.2003 Где: Italy Репутация: нет Всего: 34 |
ребята! давайте плиз один вопрос на топик!
-------------------- SST 465555 icq 200-512-712 |
|||
|
||||
| Guest |
|
|||
|
Unregistered |
У меня был сборник программ для программирования, но к несчастью он пострадал от вируса, когда я его возьму то попробую... А "Hello, world!" это вот это:
;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= ; ПРОЦ, МОДЕЛЬ, ОПЦИИ, ИНКЛУДЫ, БИБЛИОТЕКИ ИМПОРТА ;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= .386 .model flat,stdcall option casemap:none includelib kernel32.lib SetConsoleTitleA PROTO :DWORD GetStdHandle PROTO :DWORD WriteConsoleA PROTO :DWORD,:DWORD,:DWORD,:DWORD,:DWORD ExitProcess PROTO :DWORD Sleep PROTO :DWORD ;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= ; СЕКЦИЯ КОНСТАНТ ;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= .const sConsoleTitle db 'My First Console Application',0 sWriteText db 'hEILo, Wo®LD!!' ;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= ; СЕКЦИЯ КОДА ;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= .code ;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= ; Самая Главная Процедура ;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= Main PROC LOCAL hStdout :DWORD ;(1) ;титл консоли push offset sConsoleTitle ;(2) call SetConsoleTitleA ;получаем хэндл вывода ;(3) push -11 call GetStdHandle mov hStdout,EAX ;выводим HELLO, WORLD! ;(4) push 0 push 0 push 16d push offset sWriteText push hStdout call WriteConsoleA ;задержка, чтобы полюбоваться ;(5) push 2000d call Sleep ;выход ;(6) push 0 call ExitProcess Main ENDP ;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= end Main Сейчас попробую... |
|||
|
||||
![]()
|
| Правила форума "Asm для начинающих" | |
|
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, MAKCim. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Asm для начинающих | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |