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
。
print array + X
是一个算术运算,即
例如print array + 50
实际打印1 + 50 = 51
而不是不存在的第51个数组元素。
答案 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上进行了测试。