如何将javas“out.println”翻译为程序集? 不使用printf

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); } 

这是我要翻译成汇编代码的代码。 我认为我做了一切除了system.out.println(a);

我已经尝试几乎所有的东西,各种input到sys_write调用。 我不允许使用print f,而应该使用mov命令。 这是我现在的代码:

 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 

它应该在我用gdb -tui filename访问的debugging器中工作,但没有任何结果。 其余的代码做它应该的,但不是out print。 我已经尝试了几乎所有东西 帮帮我?

int aint i是32位变量,所以用32位寄存器( EAXEDX )来处理是合适的。 在32位系统中,通常应该避免使用16位寄存器( AXCX )。 使用相反的32位寄存器或8位寄存器( ALCL )。

你忘了初始化CXAX的初始化是错误的。

SYS_WRITE系统调用(int 80h)在ECX需要一个指向字符串的指针(你需要一个直接的字符)。 所以你必须首先存储这个字符,然后把一个指针加载到ECX 。 另外,在EDX您必须加载正确的字符数量才能打印。

这个工作:

 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