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。

手表部分,我有 2 个表达式:EatMsgEatLen

当我使用 KDBG 为 EatMsg 运行代码时,我看到:544497989但对于 EatLen,我看到:无法在 0xe 访问内存

我有两个问题:

这个 544497989 的值是多少?为什么我看到 EatLen 的“无法访问”消息?

4

1 回答 1

3

544497989是的地址EatMsg,它只是内存位置,即一些巨大的数字。如果您了解 C 或 C++,则相当于&eatMsg您的声明是char * eatMsg = "Eat at Joe's!";

EatLenEatMsg:的长度,$代表“此时的地址”,它是 . 的所有字节之后的下一个位置EatMsg。因此,“开头的负地址的$-EatMsg所有字节后的地址” =“长度” = 14十进制= 0x0E十六进制。EatMsgEatMsgEatMsg

您的调试器可能将此长度解释为地址。诸如此类的小值不能作为地址引用。您应该仅将其显示为一个值,而不是将其解释为地址。

于 2014-12-31T10:32:06.827 回答