Assembly 如何在不存储在变量程序集中的情况下打印ascii字符串?
基本上,我想通过直接将其存储到Assembly 如何在不存储在变量程序集中的情况下打印ascii字符串?,assembly,nasm,Assembly,Nasm,基本上,我想通过直接将其存储到ecx,在汇编中打印,即“0x4141”或“AAAA”,我在下面尝试了,但它不起作用: SECTION .data buf: db "Hello", 5 SECTION .text global _start _start: mov eax, 0x41414141 push eax pop ecx mov eax, 4 mov ebx, 1 mov edx, 4 int 0x80 mov e
ecx
,在汇编中打印,即“0x4141”或“AAAA”,我在下面尝试了,但它不起作用:
SECTION .data
buf: db "Hello", 5
SECTION .text
global _start
_start:
mov eax, 0x41414141
push eax
pop ecx
mov eax, 4
mov ebx, 1
mov edx, 4
int 0x80
mov eax, 1
int 0x80
还尝试了一些东西,比如movecx,0x4141
,但没有成功
使用
nasm-g-f elf-f dwarf./shell.asm和&ld-m elf_i386-o shell.o
以弧形编译代码:Linux-kali 5.2.0-kali2-amd64#1 SMP-Debian 5.2.9-2kali1(2019-08-22)x86_64 GNU/Linux
使用write
系统调用实际上是不可能的。ecx
中的值应该是指向要写入的字节缓冲区的指针,而不是实际字节本身
另一方面,您告诉write
系统调用写入五个字节,但是0x4141
将只有四个字节
如果您想将十六进制数字打印为实际字符串
“0x4141”
,则需要首先将数字转换为字符串,这样就更不可能了,因为它将是一个包含10个字节(可能不包括空终止符)的字符串,无法放入32位(四个字节)中注册。没有系统调用为您执行此操作。您必须自己将数字0x4141
转换为字符串“0x4141”
,然后打印该字符串。此外,write
系统调用将数据写入内存,而不是寄存器。这是没有办法的。如果有一个“写单字符”系统调用(如DOS int 21h),你可以在一行中执行几个这样的操作来写入数据,但linux没有,它只有从内存中写入的字节。基本上是,但是这个问题比较模糊,没有一个简单的好答案能真正回答这个问题。@dude,我已经把5字节改成了4字节,无论如何更新了这个问题。忘了提到我想打印“AAAA”,这样你就可以用mov ecx,esp
代替pop ecx
。然后在执行系统调用后放置一个addesp,4
,以平衡堆栈。@dude,呜呜,这很有效。那就是,把esp指针移到ecx,对吗?