2015-10-07 4 views
2
public static void main(String[] args) { 
    int a = 0; 
    for (int i = 0; i < 20; i++) { 
     if (i < 10) { 
     a++; 
     } else { 
     a--; 
     } 
    } 
    System.out.println(a); 
    System.exit(0); 
    } 

Ceci est le code que je vais traduire en code d'assemblage. Je pense que ive a réussi à faire tout sauf le system.out.println (a);Comment traduire javas "out.println" en assemblage? Sans utiliser printf

J'ai essayé presque tout, avec toutes sortes d'entrées à l'appel sys_write. Je ne suis pas autorisé à utiliser l'impression f, mais plutôt utiliser la commande mov. Ceci est le code que j'ai en ce moment:

cr equ 13 
ld equ 10 
STDOUT equ 1 
SYS_WRITE equ 4 

section .bss 
    a resb 1 

section .text 
global _start 
_start: 
    mov [a], byte 0 
    mov [a],ax 
    start_for: 
    cmp cx,20 
    jge slutt_for 
    cmp cx,10 
    jge else 
    inc ax 
    jmp slutt_if 
    else: 
    dec ax 
    slutt_if: 
    inc cx 
    jmp start_for 
    slutt_for: 


    mov ecx,eax ; This is where I need help 
    add ecx,'0' 
    mov eax,4 
    mov edx,5 
    mov ebx,1 
    int 80h  ; End where I need help 
    mov eax,1 
    int 80h 

Il est censé fonctionner dans le débogueur que j'accès avec gdb -tui nom, mais rien ne sort. Le reste du code fait ce qu'il est censé faire, mais pas l'impression. J'ai presque tout essayé. Aidez-moi?

+1

[Bonjour tout le monde dans asm 32 bits] (http://www.ithania.com/asm/001/32_nasm/index.html) et [Bonjour tout le monde en 64 -bit asm] (http://www.ithania.com/asm/001/64_nasm/index.html). –

Répondre

1

int a et int i sont des variables 32 bits, il est donc approprié de traiter avec des registres 32 bits (EAX et EDX). Dans un système 32 bits, vous devez généralement éviter les registres 16 bits (AX et CX). Utilisez à la place des registres 32 bits ou des registres 8 bits (AL,).

Vous avez oublié d'initialiser CX et l'initialisation de AX est incorrecte.

Le SYS_WRITE syscall (int 80h) nécessite dans ECX un pointeur vers une chaîne (vous avez pris un caractère immédiat). Vous devez donc d'abord stocker le caractère, puis charger un pointeur dans ECX. En outre, dans EDX vous devez charger le nombre de caractères à imprimer correct.

Celui-ci fonctionne:

section .bss 
    a resb 1 

section .text 
global _start 
_start: 
    xor eax, eax   ; a = 0 
    xor cl, cl    ; i = 0 

    start_for: 
    cmp cl, 20 
    jge slutt_for 

    cmp cl, 10 
    jge else 
    inc eax     ; a++ 
    jmp slutt_if 

    else: 
    dec eax     ; a-- 

    slutt_if: 
    inc cl     ; i++ 
    jmp start_for 

    slutt_for: 
    add al, '0' 
    mov [a], al 
    mov ecx, a    ; Pointer to a 

    write: 
    mov eax, 4    ; SYS_WRITE 
    mov edx, 1    ; Amount of chars to print 
    mov ebx, 1    ; STDOUT 
    int 80h 

    exit: 
    mov ebx, 0    ; return 0 
    mov eax, 1 
    int 80h 
+0

merci cela a fonctionné: D – Lisa