Pointers 英特尔32位处理器上的mov指令

Pointers 英特尔32位处理器上的mov指令,pointers,assembly,x86,nasm,32-bit,Pointers,Assembly,X86,Nasm,32 Bit,我是汇编语言方面的新手,我正在尝试使用NASM学习linux上的英特尔32位汇编语言,并遵循以下步骤。关于这个例子,我有一些问题: section .text global _start ;must be declared for using gcc _start: ;tell linker entry point mov edx, len ;message length mov ecx, msg ;mess

我是汇编语言方面的新手,我正在尝试使用NASM学习linux上的英特尔32位汇编语言,并遵循以下步骤。关于这个例子,我有一些问题:

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'…

  • 如果“name”变量不适合ecx寄存器,它如何存储在ecx寄存器中?(我的意思是当我们想在输出上写Zara Ali时)
  • 是否为每个字符重复系统调用(0x80)
    回答你的第二个问题。否,使用“int 0x80”指令仅进行一次系统调用。然后控制权被转移到sys_write,并将所有这些字符写入标准输出。此代码中没有jmp指令或循环,从中可以看到代码是按顺序执行的,没有跳转(不包括仅调用一次的系统调用本身)。

    mov ecx,name
    name
    的地址移动到
    ecx
    ,而不是该地址的内容。系统调用,
    sys\u write
    ,写出整个字符串。这就是为什么长度作为参数传递给
    sys\u write
    (链接示例中的
    mov-edx,len
    指令)。您可以在线查询系统调用以获取描述。只需在“LinuxSys_write”上进行谷歌搜索。哦,是的,你说得对,谢谢!