Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly 如何在不存储在变量程序集中的情况下打印ascii字符串?_Assembly_Nasm - Fatal编程技术网

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,对吗?