你如何将 javas "out.println" 翻译成程序集?不使用 printf
How do you translate javas "out.println" to assembly? Without use of 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);
我几乎尝试了所有方法,对 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 访问的调试器中工作,但没有任何结果。代码的其余部分做了它应该做的,但不是打印出来的。我几乎什么都试过了。帮忙?
int a
和int i
是32位变量,所以用32位寄存器(EAX
和EDX
)处理比较合适。在 32 位系统中,通常应避免使用 16 位寄存器(AX
和 CX
)。请改用 32 位寄存器或 8 位寄存器(AL
、CL
)。
您忘记初始化CX
并且AX
初始化错误
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
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 访问的调试器中工作,但没有任何结果。代码的其余部分做了它应该做的,但不是打印出来的。我几乎什么都试过了。帮忙?
int a
和int i
是32位变量,所以用32位寄存器(EAX
和EDX
)处理比较合适。在 32 位系统中,通常应避免使用 16 位寄存器(AX
和 CX
)。请改用 32 位寄存器或 8 位寄存器(AL
、CL
)。
您忘记初始化CX
并且AX
初始化错误
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