我是汇编语言的新手,我正在尝试使用nasm上的Linux上的Intel 32bit Assembly语言,并遵循教程Spoint的汇编教程。我在此示例上有一些问题:
section .text
global _start ;must be declared for using gcc
_start: ;tell linker entry point
mov edx, len ;message length
mov ecx, msg ;message to write
mov ebx, 1 ;file descriptor (stdout)
mov eax, 4 ;system call number (sys_write)
int 0x80 ;call kernel
mov eax, 1 ;system call number (sys_exit)
int 0x80 ;call kernel
section .data
msg db 'Hello, world!',0xa ;our dear string
len equ $ - msg ;length of our dear string
我知道name db 'Zara Ali'
是name db 'Z','a','r','a'....
的速记,但
- 如果不适合它,则如何将"名称"变量存储在ECX寄存器中?(我的意思是当我们想在输出上写zara ali时)
- 系统调用(0x80)是否重复了每个字符?
回答您的第二个问题。不," INT 0x80"指令仅进行一次系统调用。然后将控件传输到SYS_WRITE,并将所有这些字符写入Stdout。此代码中没有JMP指令或循环,您可以从中看到该代码是连续执行的,没有跳跃(不包括Syscall本身,仅称为一次)。
指令mov ecx, msg
不会移动数组内容而不是将变量指向ecx
寄存器。如果您想从该地址加载4个字节到ecx
,则在地址周围使用方括号:mov ecx, [msg]
。(通常您不希望使用该字符串数据,因为这仅是 value 的 part ,而write(int fd, void *buf, size_t len)
系统呼叫需要指针。)
其次,系统调用0x80
和使用int
指令进行的所有其他系统调用,请立即将控件传输到决定该怎么做的内核,在这种情况下,请写入标准。
,简而言之, mov ecx, msg
将指针移至ecx
而不是实际内容。其次,int 0x80
仅被调用一次。
如果您确实想从字符串中加载一个字节,则movzx eax, byte [ecx]
是标准方式,将其扩展到dword寄存器中。