linux NASM Hello, world!

section .data                      ;定义数据段 'SECTION'指令('SEGMENT'跟它完全等效)
msg     db      "Hello, world!",0xA  ;our dear string

len     equ     $ - msg

'EQU'定义一个符号,代表一个常量值:当使用'EQU'时,源文件行上必须包含一个 label。
'EQU'的行为就是把给出的 label 的名字定义成它的操作数(唯一)的值。定义是不可更
改的,比如:
message      db   'hello, world'
      msglen    equ     $-message
把'msglen'定义成了常量 12。'msglen'不能再被重定义。这也不是一个预自理定义:
'msglen'的值只被计算一次,计算中使用到了'$'(参阅 3.5)在此时的含义:

--------------3.5------------------

NASM 在表达式中支持两个特殊的记号,即'$'和'$$',它们允许引用当前指令
的地址。'$'计算得到它本身所在源代码行的开始处的地址;所以你可以简
单地写这样的代码'jmp $'来表示无限循环。'$$'计算当前段开始处的地址,
所以你可以通过($-$$)找出你当前在段内的偏移。
----------------------------------

注意
‘EQU’的操作数也是一个严格语法的表达式。(参阅 3.8)


section .text ;section declaration
             ;we must export the entry point to the ELF linker or
global _start;loader. They conventionally recognize _start as their
             ;entry point. Use ld -e foo to override the default.
_start:
;write our string to stdout
    mov   eax,4   ;system call number (sys_write)
    mov   ebx,1   ;first argument: file handle (stdout)
    mov   ecx,msg ;second argument: pointer to message to write
    mov   edx,len ;third argument: message length
    int   0x80    ;call kernel
;and exit
    mov     eax,1   ;system call number (sys_exit)
    xor     ebx,ebx ;first syscall argument: exit code

   int     0x80    ;call kernel

-------------------------------

$ nasm -f elf hello.asm
$ ld -s -o hello hello.o


你可能感兴趣的:(linux NASM Hello, world!)