Assembly 程序集错误-写入字符串时需要指令

Assembly 程序集错误-写入字符串时需要指令,assembly,nasm,shellcode,Assembly,Nasm,Shellcode,在为外壳代码编写最简单的程序集时,我编写了以下代码 BITS 64 global _start section .data _start: ;ssize_t write(int fd, const void *buf, size_t count); ;rax = 1 jmp poziv vracajse: xor rsi,rsi pop rsi xor rax,rax mov al,1 ; were calling write ;The parameters are in rdi,

在为外壳代码编写最简单的程序集时,我编写了以下代码

BITS 64
global _start
section .data
_start:
  ;ssize_t write(int fd, const void *buf, size_t count);
  ;rax = 1

jmp poziv

vracajse:
xor rsi,rsi
pop rsi
xor rax,rax
mov al,1 ; were calling write
;The parameters are in rdi, rsi, rdx, r10, r8, r9. in that order
xor rdi,rdi ;
xor rcx,rcx ; need low 8 bytes dont want null in machine code
mov cl,1
mov edi,ecx ; edi =1 writing to stdout
xor rdx,rdx
mov dl,15 ; were writing 15 chars
syscall

poziv:
call vracajse

poruka:
.ascii "Pozdrav svete!\n"
并得到以下错误

writing_2nd_try.nasm:28: error: parser: instruction expected
为什么他告诉我我的代码poruka: .ascii“Some string”不是有效的指令(标签和消息),但如果我将其写为db,则可以

(我还感兴趣的是,如果我写.section数据而不是section.data,我会得到以下错误

writing_2nd_try.nasm:3: error: attempt to define a local label before any non-local labels
writing_2nd_try.nasm:3: error: parser: instruction expected
)

我对这一切有点陌生,但我想我知道我在做什么

为什么是告诉我我的代码
poruka:.ascii“Some string”
不是有效的指令(标签和消息),但如果我将其写为
db
,则可以

汇编程序之间的语法和指令不同
.ascii
是GNU汇编程序可以识别的指令,但是对于NASM,您可以使用
db
(声明字节),正如您已经发现的那样

(我还感兴趣的是,如果我写.section数据而不是section.data,我会得到以下错误

writing_2nd_try.nasm:3: error: attempt to define a local label before any non-local labels
writing_2nd_try.nasm:3: error: parser: instruction expected

因为
section
是NASM可以识别的指令,而
.section
不是。所以NASM认为您正在声明一个名为
section
的本地标签(在NASM语法中,以句点开头的标签名被认为是本地的)因此NASM看到一个名为
section
的本地标签,后面跟着一个单词
data
,这毫无意义。

欢迎使用Stackoverflow,这里不欢迎使用pastebin站点,因为内容仅在使用
db
的两侧临时可用,NASM将允许您将字符串括在单引号、双引号或双引号中“反引号”(我们在这里用来表示
code
)的字符。反引号,而不是其他两个,将允许Nasm识别“\n”和其他C-ish转义序列。否则,您将看到“\n”作为文本。