英特尔32位元上的mov指令

时间:2019-03-12 10:55:53

标签: pointers assembly x86 nasm 32-bit

我是汇编语言的新手,我正在尝试使用NASM并遵循assembly tutorial of tutorialspoint在linux上学习intel 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'....的简写,但是

  1. 如果'name'变量不合适,如何将其存储在ecx寄存器中? (我是说,当我们要在输出上编写Zara Ali时)
  2. 是否为每个字符重复了系统调用(0x80)?

1 个答案:

答案 0 :(得分:1)

回答第二个问题。不,使用“ int 0x80”指令只能进行一次系统调用。然后将控制权转移到sys_write,并将所有这些字符写入stdout。此代码中没有jmp指令或循环,从中您可以看到代码按顺序执行,没有跳转(不包括仅被调用一次的syscall本身)。