0

そうそう、私はアセンブリレベルのプログラミングをいじっています...

これが私がこれまでに持っているものです。

global _start

section .text
_start:

    mov eax, 4      ; write
    mov ebx, 1      ; stdout
    mov ecx, msg
    mov edx, msg.len
    int 0x80        ; system call


    mov eax, 1      ; exit
    mov ebx, 0      ; exit code
    int 0x80        ; system call

section .data

    msg: db "Hello world!", 10  ; Defines the string "Hello world!\n"
    .len equ $-msg

声明はどのように機能し.len equ $-msgますか?これが文字列の長さだと理解しています。また、equ が C のようなものであることも知ってい#defineます。したがって、この変数はメモリ内に存在せず、アセンブラによって配置されます。(ナズム)

$ 記号は何をするもので、その後に減算が行われるのでしょうか?

私の出力はセグメンテーション違反を引き起こし.len equ $-msgます。構文を理解したら、これを自分で修正できることを願っています。障害を修正しましたが、まだ $ 概念を理解していません。

これが不正なプログラムであることが原因であるEDIT Segfault。修理済み

4

1 に答える 1

2

$現在の行のアドレスを表します。したがって、次のようになります。

.len  equ  $-msg

現在のアドレスから のアドレスを引いたものを意味しますmsgmsgこれにより、 と の間に格納されたデータの長さが得られます.len( のアドレスは.lenで表されるため$)。したがって、記号.lenはその長さの値を表します (等しいと見なされます)。

于 2013-07-25T01:00:59.697 に答える