从gdb中的.bss打印“数组”

时间:2015-08-30 20:16:29

标签: arrays assembly gdb nasm

my nasm x86汇编代码包含以下内容:

; The code should mimic the following C-code:
; int a[10];
; for (int i = 0; i < 10; i++){
;    a[i] = i;
; }

SECTION .data
    arraylen dd 10
SECTION .bss
    array RESD 10
SECTION .text
    global main
main:
    mov ecx, 0
    mov eax, 0
loop:
    inc ecx
    mov dword [array+eax*4], ecx
    inc eax
    cmp ecx, arraylen
    jl loop
end:
    mov ebx, 0
    mov eax, 1
    int 0x80

现在我想要检查此代码是否在gdb中有效。 但是,我如何打印array

print array仅返回$1 = 1

不幸的是,{p> print array + X是一个算术运算,即 例如print array + 50实际打印1 + 50 = 51而不是不存在的第51个数组元素。

3 个答案:

答案 0 :(得分:4)

你可以这样做:

(gdb) x/10 &array
0x8049618:      1       2       3       4
0x8049628:      5       6       7       8
0x8049638:      9       10

PS:您的代码已损坏,需要cmp ecx, [arraylen]

答案 1 :(得分:3)

  

代码应该模仿以下C代码:

除了Jester提到的错误边界之外,您还有错误的初始化:您的代码相当于:

json.dumps(my_query_dict)
  

但是,如何打印 for (int i = 0; i < 10; i++) { a[i] = i + 1; // different from stated goal of "a[i] = i;" }

这与array中的打印数组没什么不同,当编译源时没有调试信息:

C
  不幸的是,

print array + X是一个算术运算

然后您可以使用:

(gdb) p array
$1 = 0

(gdb) p {int[10]}&array
$2 = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}

答案 2 :(得分:0)

ARM示例

x86应该类似:

.data:
a1:
    .float 0.0, 0.1, 0.2, 0.3
a2:
    .word 1, 2, 3, 4
.text
    /* Register r1 contains the address of a1. */
    ldr r1, =a1
    ldr r2, =a2

GDB会话:

(gdb) p (float[4])a1
$1 = {0, 0.100000001, 0.200000003, 0.300000012}
(gdb) p (int[4])a2
$2 = {1, 2, 3, 4}
(gdb) p (float[4])*$r1
$5 = {0, 0.100000001, 0.200000003, 0.300000012}
(gdb) p (int[4])*$r2
$7 = {1, 2, 3, 4}

在GDB 8.1,Ubuntu 18.04上进行了测试。