在英特尔32位上移动指令



我是汇编语言的新手,我正在尝试使用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'....的速记,但

  1. 如果不适合它,则如何将"名称"变量存储在ECX寄存器中?(我的意思是当我们想在输出上写zara ali时)
  2. 系统调用(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寄存器中。

最新更新