【问题标题】:How do you translate javas "out.println" to assembly? Without use of printf你如何将javas“out.println”翻译成程序集?不使用 printf
【发布时间】:2016-01-05 01:22:21
【问题描述】:
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);

我几乎尝试了所有方法,包括对 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 访问的调试器中工作,但没有任何结果。其余的代码做它应该做的,但不是输出。我几乎什么都试过了。帮忙?

【问题讨论】:

标签: java linux assembly printf nasm


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-08-01
    • 2014-05-31
    • 2011-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-27
    相关资源
    最近更新 更多