Tyl*_*ert 3 linux x86 assembly nasm
我有以下用 nasm Assembly 编写的程序:
section .text
global _start:
_start:
; Input variables
mov edx, inLen
mov ecx, inMsg
mov ebx, 1
mov eax, 4
int 0x80
mov edx, 2
mov ecx, num1
mov ebx, 0
mov eax, 3
int 0x80
mov edx, inLen
mov ecx, inMsg
mov ebx, 1
mov eax, 4
int 0x80
mov edx, 2
mov ecx, num2
mov ebx, 0
mov eax, 3
int 0x80
; Put input values in correct registers
mov eax, [num1]
sub eax, '0' ; convert char to num
mov ebx, [num2]
sub ebx, '0' ; convert char to num
; Perform addition
add eax, ebx
add eax, '0' ; convert num to char
; Set sum in res
mov [res], eax
; Output result
mov edx, resLen
mov ecx, resMsg
mov ebx, 1
mov eax, 4
int 0x80
mov edx, 1
mov ecx, res
mov ebx, 1
mov eax, 4
int 0x80
; Exit program
mov eax, 1
int 0x80
section .bss
num1 resb 2
num2 resb 2
res resb 2
section .data
inMsg db "Input number: ", 0xA, 0xD
inLen equ $-inMsg
resMsg db "Result: ", 0xA, 0xD
resLen equ $-resMsg
Run Code Online (Sandbox Code Playgroud)
当我运行它时,控制台看起来像这样:
tyler@ubuntu:~/ASM/Addition$ ./Add
Input number:
3
Input number:
2
Result:
5tyler@ubuntu:~/ASM/Addition$
Run Code Online (Sandbox Code Playgroud)
我怎样才能得到它,所以 5 将打印在它自己的行上,而不是在它之后直接打印 cmd?IE 它应该是这样的:
tyler@ubuntu:~/ASM/Addition$ ./Add
Input number:
3
Input number:
2
Result:
5
tyler@ubuntu:~/ASM/Addition$
Run Code Online (Sandbox Code Playgroud)
您已经拥有所有信息,只是还没有看到:
resMsg db "Result: ", 0xA, 0xD
Run Code Online (Sandbox Code Playgroud)
你知道这到底是什么意思吗?它定义了一个由以下字符组成的字符串:
Result: XY
Run Code Online (Sandbox Code Playgroud)
... whereX和Y实际上是不可见字符(数值 0xA=10 和 0xD=13,也称为换行 (LF) 和回车 (CR)),它们会导致输出换行到新行。由于它们的不可见性,它们被指定在双引号之外 - 你不能只将它们包含在那里,所以你必须写下它们的数值。
当然,您也可以单独使用它们:
newLineMsg db 0xA, 0xD
newLineLen equ $-newLineMsg
Run Code Online (Sandbox Code Playgroud)
(newLineLen当然是 2,但我把它留在这里是为了使系统与您当前使用的系统相同,以便于理解。)
所以只输出一个没有任何其他文本的换行符(你想在 之后做什么5),你可以使用:
mov edx, newLineLen
mov ecx, newLineMsg
mov ebx, 1
mov eax, 4
int 0x80
Run Code Online (Sandbox Code Playgroud)
...就像resMsg/ resLen。
但是,正如 Jester 指出的那样,在 Linux 上,您还应该能够仅输出一个换行符 (0xA)(并且还可以0xD从代码中删除现有的's)。