Intel-синтаксис в Ассемблере (странно)

Модератор: Модераторы разделов

Аватара пользователя
Dudraug
Сообщения: 313
ОС: Debian lenny/sid

Intel-синтаксис в Ассемблере

Сообщение Dudraug »

Проблема такая в унивре мы учим асм, Intel-синтаксис, погуглив я нашел что компилятор fasm и nasm держат его
поставил начал компилить, и увидел ошибки O_O
что в nasm что в fasm
код не компилится

поставил на Досбокс tasm (от Борланда, рекомендованный компилер)
он эту прогу собрал
мне в принципе все равно я могу и под досбоксом писать, но хочется докапаться до истины

Код:

; Prg_6_l.asm '• ;Программа преобразования двузначного шестнадцатеричного числа ;в символьном виде в двоичное представление. ;Вход: исходное шестнадцатеричное число из двух цифр, ;вводится с клавиатуры. ;Выход: результат преобразования помещается в регистр dl. data segment para public "data" ;сегмент данных message db "Введите две шестнадцатеричные цифры,$" data ends stk segment stack db 256 dup ("?") ;сегмент стека stk ends code segment para public "code" ;начало сегмента кода main proc ;начало процедуры main assume cs:code,ds:data,ss:stk mov ax,data ;адрес сегмента данных в регис ;продол mov ds,ax ;ax в ds mov ah,9 mov dx,offset message int 21h xor ax ,ax ;очистить регистр ах mov ah, 1h ;Ih в регистр ah int 21h ;генерация прерывания с номером 21h mov dl,al ;содержимое регистра al в регистр dl sub dl,30h ;вычитание: (dl)=(dl)-30h cmp dl,9h ;сравнить (dl) с 9h jle Ml ;перейти на метку Ml, если dl<9h или dl=9h sub dl, 7h ;вычитание: (dl)=(dl)—7h Ml: ;определение метки Ml mov cl,4h ;пересылка 4h в регистр cl shl dl,cl ;сдвиг содержимого dl.Ha 4 разряда влево int 21h ;вызов прерывания с номером 21h sub al,30h ;вычитание: (dl)=(dl)—30h cmp al,9h ;сравнить (al) с 9h jle M2 ;перейти на метку М2, если al<9h или al=9h sub al ,7h ;вычитание: (al)=(al)-7h M2: ;определение метки М2 add dl,al ;сложение: (dl)=(dl)+(al) mov ax,4c00h ;пересылка 4c00h в регистр ах int 21h ;вызов прерывания с номером 21п main endp ;конец процедуры m a i n code ends ;конец сегмента кода end main ;конец программы с-точкой входа main



Код: Выделить всё

[dudraug@localhost fasm]$ ./fasm ~/dos/r/new.asm
flat assembler  version 1.67.22  (16384 kilobytes memory)
/home/dudraug/dos/r/new.asm [7]:
data segment para public "data"      ;сегмент данных
error: illegal instruction.


Этот пример взят из книге по асму
в примерах что нам препод дал ( электорном виде) синтаксис(или оформление?) отличается
например

Код:

.model small .386 .stack 100h .data N120 dw 120 N20 dw 20 N6 dw 6 N64 dw 256 F1_5 dd 1.5 FramesCount dd 0 TimerCount dd 0 StartTimerCount equ 1 EndTimerCount equ 1001 msg_frames_count db "Processed frames: ",0 msg_eol db 13,10,0 texture db 4096 dup (?) dxyfxy dq 240 dup (?) xytmp dd ? N dw ? text_buf db 40 dup (?) old_vector_1ch dd ? .code main proc cld xor bx, bx mov cl, byte ptr ds:[80h] xor ch, ch jcxz mainTP30 mov si, 81h mainTP10: cmp byte ptr ds:[si], '!' jne short mainTP20 inc bx mainTP20: inc si loop mainTP10 mainTP30: mov ax, @data mov ds, ax mov es, ax push bx call PreCalculate call GenerateTexture call SetGraph mov N, 0 pop bx and bx, bx jz mainD00 ; stress mode mainS00: call Install1ch mainS1v: hlt cmp TimerCount, StartTimerCount jne mainS1v mainS10: call ShowTexture2 inc FramesCount inc N cmp N, 240 jne mainS20 mov N, 0 mainS20: cmp TimerCount, EndTimerCount jl mainS10 call Deinstall1ch jmp mainF00 ; end of stress mode ; demo mode mainD00: mainD10: call VWait call ShowTexture2 inc FramesCount inc N cmp N, 240 jne mainD20 mov N, 0 mainD20: in al, 60h cmp al, 1ch jne mainD10 ; end of demo mode mainF00: call SetText mov eax, FramesCount lea di, text_buf call Long2Text lea si, msg_frames_count call PrintString lea si, text_buf call PrintString lea si, msg_eol call PrintString mov ax, 4c00h int 21h main endp VWait proc mov dx, 03dah vw1: in al, dx test al, 8 jnz vw1 vw2: in al, dx test al, 8 jz vw2 ret VWait endp GenerateTexture proc lea di, texture mov bx, 64 gt10: mov cx, 64 gt20: mov al, bl sub al, 32 jnl gt31 neg al gt31: mov ah, cl sub ah, 32 jnl gt32 neg ah gt32: add al, ah add al, 32 stosb loop gt20 dec bx jnz gt10 ret GenerateTexture endp SetGraph proc mov ax, 0013h int 10h ret SetGraph endp SetText proc mov ax, 0003h int 10h ret SetText endp ShowTexture2 proc push es mov ax, 0A000h mov es, ax mov di, 0 mov ax, N shl ax, 3 lea si, dxyfxy add si, ax mov edx, [si+4] ; EDX - YYXX mov esi, [si] ; ESI - dYYXX mov cx, 200 sht240: push cx push edx mov cx, 320/4 sht250: mov ebx, edx shr ebx, 18 ; bx = y<<6 and bx, 0fc0h ; and 00001111 11000000 add bl, dh ; bx += x mov al, byte ptr ds:[bx + offset texture] ror eax, 8 add edx, esi and edx, 3fff3fffh mov ebx, edx shr ebx, 18 ; bx = y<<6 and bx, 0fc0h ; and 00001111 11000000 add bl, dh ; bx += x mov al, byte ptr ds:[bx + offset texture] ror eax, 8 add edx, esi and edx, 3fff3fffh mov ebx, edx shr ebx, 18 ; bx = y<<6 and bx, 0fc0h ; and 00001111 11000000 add bl, dh ; bx += x mov al, byte ptr ds:[bx + offset texture] ror eax, 8 add edx, esi and edx, 3fff3fffh mov ebx, edx shr ebx, 18 ; bx = y<<6 and bx, 0fc0h ; and 00001111 11000000 add bl, dh ; bx += x mov al, byte ptr ds:[bx + offset texture] ror eax, 8 add edx, esi and edx, 3fff3fffh stosd loop sht250 rol esi, 16 pop edx add edx, esi sub dx, si sub dx, si and edx, 3fff3fffh ror esi, 16 pop cx dec cx jnz sht240 pop es ret ShowTexture2 endp PreCalculate proc finit mov cx, 240 mov N, 0 lea di, dxyfxy pc10: ; count scale fild N fldpi fmulp st(1), st fild N120 fdivp st(1), st fsin fild N fldpi fmulp st(1), st fild N20 fdivp st(1), st fsin fild N6 fdivp st(1), st fld F1_5 fadd fadd fild N64 fdivp st(1), st ; count alpha fild N fldpi fmulp st(1), st fild N120 fdivp st(1), st fsin fldpi fmulp st(1), st ; st(0) = alpha ; st(1) = scale/64 fsincos ; st(0) = cos alpha ; st(1) = sin alpha ; st(2) = scale/64 fdiv st, st(2) fistp word ptr xytmp fdivrp st(1), st fistp word ptr xytmp+2 ; copy tmp to dx & dy lea si, xytmp movsd ; calc -160*dxh+100*dyh mov ax, -160 imul word ptr xytmp mov word ptr [di], ax mov ax, 100 imul word ptr xytmp+2 add word ptr [di], ax and word ptr[di], 3fffh ; calc -160*dyh-100*dxh mov ax, -160 imul word ptr xytmp+2 mov word ptr [di+2], ax mov ax, -100 imul word ptr xytmp add word ptr [di+2], ax and word ptr[di+2], 3fffh add di, 4 inc N dec cx jz pc20 jmp pc10 pc20: ret PreCalculate endp Long2Text proc ; converts eax to asciiz at es:di ; mov ebx, 10 push bx l2t10: xor edx, edx div ebx push dx or eax, eax jnz l2t10 l2t20: pop ax cmp ax, bx je l2t30 add al, 30h stosb jmp l2t20 l2t30: xor al, al stosb ret Long2Text endp PrintString proc ; displays at stdout asciiz from ds:si ; mov ah, 02h ps10: mov dl, ds:[si] or dl, dl jz ps20 int 21h inc si jmp ps10 ps20: ret PrintString endp Interrupt1ch proc push ds push ax mov ax, @data mov ds, ax inc TimerCount pop ax pop ds iret Interrupt1ch endp Install1ch proc push es mov ax, 351ch int 21h mov word ptr old_vector_1ch, bx mov word ptr old_vector_1ch+2, es pop es push ds mov ax, 251ch mov dx, offset Interrupt1ch push cs pop ds int 21h pop ds ret Install1ch endp Deinstall1ch proc push ds mov ax, 251ch mov dx, word ptr old_vector_1ch mov ds, word ptr old_vector_1ch+2 int 21h pop ds ret Deinstall1ch endp end main


в tasm тоже компилится а в fasm нет

Код: Выделить всё

[dudraug@localhost fasm]$ ./fasm ~/dos/test.asm
flat assembler  version 1.67.22  (16384 kilobytes memory)
/home/dudraug/dos/test.asm [1]:
.model  small
error: illegal instruction.
P4-3.0, ASUS P5GD1, 1024MB OЗУ, GeForce 6600GT
Спасибо сказали:
v04bvs
Сообщения: 636
ОС: Debian GNU/Linux

Re: Intel-синтаксис в Ассемблере

Сообщение v04bvs »

Во-первых никто не обещал, что nasm будет соместим с диалектом от бормана. Читай примеры, которые идут с ассемблером.
Во-вторых ввод-вывод в линуксе отличается от ДОСа, и эта программа работать не будет, даже если скомпилируется.

Проще всего юзать досбокс и tasm - и тебе, и преподу.
Следующий по сложности вариант - юзать nasm и libc для ввода-вывода (и возможно для других целей). Можешь посмотреть примеры, которые идут с nasm-ом, там вроде это было.
Самый крутой вариант - юзать линуксовые прерывания напрямую, но это для истинных ценителей дзена.
Спасибо сказали:
__c0d0__
Сообщения: 6
ОС: slackware 12.0 / windows xp

Re: Intel-синтаксис в Ассемблере

Сообщение __c0d0__ »

FASM поддерживает Intel-синтаксис только в части описания инструкций процессора, в части же директив препроцессора он совершенно отличен от tasm и masm. Да nasm со своими директивами (ближе кстати к FASM).
Под Линухом есть свой ассемблер (as) и линкер (ld), но здесь и синтаксис инструкций совсем другой (отличается). Вместо 21h, используется 80h - это уже различия в системных вызовах и т.д....

ЛЮДИ РАЗНЫЕ, ОСИ РАЗНЫЕ, И ВООБЩЕ ВСЕ РАЗНОЕ (А ПРОЦЕССОР INTEL :D :D :D).
Спасибо сказали: