mov edx, len
mov edx, len1
你能指望什么?
您正在覆盖寄存器edx
.
这就像其他编程语言中的以下代码一样:
variableEdx = len;
variableEdx = len1;
第二行将覆盖变量variableEdx
第一行的效果就会消失!
如何打印多个字符串
功能eax=4
将内存中从某个地址开始到某个设备的某个地址结束的一些数据写入。
如果第二个字符串紧随内存中的第一个字符串,则可以将包含两个字符串的内存发送到设备。
Example:
...
mov edx, str1
mov ecx, 32
...
这将发送 32 个字节的内存内容,从str1
到设备。 32 字节开始于str1
是字符串str1
and str2
.
如果您想将多个内存块发送到设备,您可以使用writev()
系统调用,即函数eax=146
, 反而。 (看这个链接 https://www.man7.org/linux/man-pages/man2/writev.2.html).
Example:
.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 位字组成。第一个字是要写入设备的存储器的地址;第二个字是要写入的字节数。
上面的例子写的是“你好,Learing 我喜欢编程":
“msg”的前 7 个字节,然后是“str1”的前 8 个字节,然后是“str3”的所有 19 个字节。