2010-11-07 33 views
2

J'apprends le langage assembleur avec la syntaxe Intel. J'utilisais Win XP et MASM 4.0 et tout allait bien. Récemment, j'ai migré tous mes devoirs à Linux (Ubuntu 10.04), en essayant d'assembler des codes avec nasm ou nasm Je reçois beaucoup d'erreurs (presque dans chaque ligne). J'ai également ajouté .intel_syntax en première ligne. voici mon premier programme d'assemblage:Comment faire pour utiliser NASM avec la syntaxe intel?

.intel_syntax 
stksg segment stack 
    db 32 dup ("stack") 
stksg ends 

datasg segment para 'data' 
    m1 db "Enter 1st number: " , '$' 
    m2 db "Enter 2nd number: " , '$' 
    number1 label byte 
    max1 db 10 
    ln1 db ? 
    n1 db 10 dup(0) 
    dollar db '$' 
    number2 label byte 
    max2 db 10 
    ln2 db ? 
    n2 db 10 dup(0) 
    p1 db 10 dup(' ') 
datasg ends 

codesg segment para 'code' 
    main proc far 
    assume ds:datasg, cs:codesg, ss:stksg 
    mov ax, datasg 
    mov ds, ax 
    mov ah,06h ;clear screen 
    mov al,25 ;number of rows to clear 
    mov ch,0 ;UL row 
    mov cl,0 ;UL col 
    mov ch,24 ;BR row 
    mov cl,79 ;BR col 

    mov bh,07h ;attribute (back:black, text:white) 
    int 10H 
    mov dx, offset m1 ;prints m1 
    mov ah,9h 
    int 21h 
    mov ah,0ah  ;gets number 1 
    mov dx,offset number1 
    int 21h 
    mov ah,02h  ;move cursor 
    mov dh,1 
    mov dl,0 
    mov bh,0 
    int 10h 
    mov dx, offset m2 ;prints m2 
    mov ah,9h 
    int 21h 
    mov ah,0ah  ;gets number 2 
    lea dx,number2 
    int 21h 
    mov ah,09h 
    mov bl,ln1 
    lea ax,ln1 
    ;mov [ln1+1],'$' 
    mov p1,bl 
    add ln1,30h 
    ;lea dl,(offset p1)+1 
    ;mov [dl],'$' 
    ;mov offset p1+1,'$' 
    lea dx,ln1 
    int 21h 
; mov bx,0 
; mov cx,1 
;f1: mov dl,[offset n1+cx] 
; sub dl,30h  ;convert to number 
; mov al,10 
; mul bx   ; ax = bx*10  
; mov bx,ax  ; bx=ax === bx=bx*10  
; add bx,dl  
; inc cx 
; cmp cx,ln1  
; jne f1 
    mov ah,01h  
    int 21h 
    mov ax, 4c00h 
    int 21h 
    main endp 
codesg ends 
end main 
end 

Répondre

0

Avez-vous lu les messages d'erreur que GCC vous donne? Il y a beaucoup d'erreur "pas d'instruction".

Error: no such instruction: `stksg segment stack

Vous pouvez lire au sujet de la Intel Instruction Set for x86 et de voir quelles sont les instructions que vous pouvez utiliser.

Donc, ce que vous devez faire est de passer en revue le jeu d'instructions Intel et voir à ce que vous utilisiez les instructions appropriées.

Par exemple, lorsque vous souhaitez créer une procédure que vous écrivez:

procedureName: et le code de cette procédure après le côlon. Le segment data et le segment text sont tous deux définis comme suit: .data et .text. Voici un exemple d'une procédure correctement écrite provenant d'un IO system I wrote.

setinpos:                
     pushl %ebp 
     movl %esp, %ebp 

     movl 8(%ebp), %eax 

     movl %eax, BUFFERT_POSITION_POINTER 

     movl %ebp, %esp 
     popl %ebp 

     ret 

Commencer avec la conversion de petites portions de code, ligne par ligne.

+0

Ai-je mal compris la question/le problème? Quand je relis votre question, j'ai l'impression que vous voulez utiliser la syntaxe MASM avec NASM? –

+1

Oui. J'ai vraiment besoin d'utiliser la syntaxe MASM dans Ubuntu avec NASM, GAS ou tout autre chose. Maintenant, j'essaie d'exécuter mon ancien MASM par le vin dans Ubuntu ...: < –

+0

afaik utilisant MASM sur autre chose que Windows viole les copyrights de Microsoft. Peut-être que vous devriez vérifier ce projet: http://www.japheth.de/JWasm.html et ce http://stackoverflow.com/questions/304555/masm-under-linux –

0

Nasm est un assembleur de syntaxe Intel. MASM et NASM ont des différences qui sont mentionnées dans le manuel NASM. De plus, vous ne pouvez pas utiliser les interruptions DOS sous Linux. L'appel système Linux est via intterupt 80h.