1

私は Jeff Duntemann の本を勉強しています: Step by Step Assembly です。提供されるソースコードは次のとおりです。

SECTION .data           ; Section containing initialised data

    EatMsg: db "Eat at Joe's!",10
    EatLen: equ $-EatMsg    

SECTION .bss            ; Section containing uninitialized data 

SECTION .text           ; Section containing code

global  _start          ; Linker needs this to find the entry point!

_start:
    nop         ; This no-op keeps gdb happy...
    mov eax,4       ; Specify sys_write call
    mov ebx,1       ; Specify File Descriptor 1: Standard Output
    mov ecx,EatMsg      ; Pass offset of the message
    mov edx,EatLen      ; Pass the length of the message
    int 80H         ; Make kernel call

    MOV eax,1       ; Code for Exit Syscall
    mov ebx,0       ; Return a code of zero 
    int 80H         ; Make kernel call

64 ビット MacOS Yosemite 上の VirtualBoxVM で Ubuntu 12.04 32 ビットを実行しています。

呼んでいます:

kdbg eatsyscall

KDBG を起動します。

時計セクションには、EatMsg と EatLen の 2 つの式があります

EatMsg に KDBG を使用してコードを実行すると、次のように表示されます: 544497989が、EatLen では次のように表示されます: 0xe でメモリにアクセスできません

2 つの質問があります。

この 544497989 の値は何ですか? EatLen で「アクセスできません」というメッセージが表示されるのはなぜですか?

4

1 に答える 1

3

544497989は のアドレスですEatMsg。単なるメモリ位置です。つまり、巨大な数です。C または C++ を知っている&eatMsg場合は、宣言がchar * eatMsg = "Eat at Joe's!";

EatLenEatMsg:$のすべてのバイトの後の次の位置である「この時点のアドレス」を表しますEatMsg。「の先頭のアドレスを引い$-EatMsgたすべてのバイトの後のアドレス」 = 「長さ」 = 14 10 進 = 0x0E 16 進。EatMsgEatMsgEatMsg

デバッガーは、この長さをアドレスとして解釈している可能性があります。このような小さな値はアドレスとして参照できません。これをアドレスとして解釈するのではなく、単に値として表示する必要があります。

于 2014-12-31T10:32:06.827 に答える