[英]how to print multiple strings on new line in the Assembly Language
我正在尝试在 Assembly 的不同行上打印多个字符串,但使用我的代码,它只会打印最后一个字符串。 我对汇编语言很陌生,所以请多多包涵
section .text
global _start
_start:
mov edx, len
mov edx, len1
mov edx, len2
mov edx, len3
mov ecx, msg
mov ecx, str1
mov ecx, str2
mov ecx, str3
mov ebx, 1
mov eax, 4
int 0x80
mov eax, 1
int 0x80
section .data
msg db 'Hello, world!',0xa
str1 db 'Learning is fun!',0xa
str2 db 'I love beacon!',0xa
str3 db 'I love programming',0xa
len1 equ $ - str1
len2 equ $ - str2
len3 equ $ - str3
len equ $ - msg
它只会打印出我喜欢编程。
它应该打印
Hello World!
Learning is fun!
I love beacon!
I love programming
mov edx, len mov edx, len1
你能指望什么?
您正在覆盖寄存器edx
。
这就像其他编程语言中的以下代码一样:
variableEdx = len;
variableEdx = len1;
第二行会覆盖变量variableEdx
,第一行的效果就没有了!
如何打印多个字符串
Function eax=4
将一些数据写入 memory 中,从某个地址开始,到某个设备的某个地址结束。
如果第二个字符串紧跟在 memory 中的第一个字符串之后,您可以将包含两个字符串的 memory 发送到设备。
例子:
...
mov edx, str1
mov ecx, 32
...
这将从str1
开始的 memory 内容的 32 个字节发送到设备。 从str1
开始的 32 个字节是字符串str1
和str2
。
如果要将 memory 的多个块发送到设备,可以使用writev()
系统调用,即 function eax=146
。 (请参阅此链接)。
例子:
.text
.globl _start
_start:
mov edx, 3
mov ecx, offset list
mov ebx, 1
mov eax, 146
int 0x80
mov eax, 1
int 0x80
.data
list:
.long msg
.long 7
.long str1
.long 8
.long str3
.long 19
...
不幸的是,我使用的汇编器的语法与您的略有不同。 但是,在您的程序集中, list
部分可能如下所示:
list dd msg
dd 7
dd str1
...
writev
(函数 146)获取指向ecx
寄存器中某个“列表”的指针以及edx
寄存器中列表中的条目数。
列表中的每个条目由两个 32 位字组成。 第一个字是要写入设备的memory的地址; 第二个字是要写入的字节数。
上面的例子写着“你好,学习我喜欢编程”:
“msg”的前 7 个字节,然后是“str1”的前 8 个字节,然后是“str3”的所有 19 个字节。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.