当我用与寻址模式相同的表达式计算地址时,为什么gdb没有向我显示BSS数组的变化?

时间:2016-09-04 13:39:43

标签: assembly gdb x86-64 mov yasm

在.bss段中用大缓冲区编写简单程序

$(window).resize(function(){
        ChartFunctionName();
        });

然后尝试增加一些数组单元格的值。

function TekenBasisschoolUitstroom() 

    {

        var data = new google.visualization.arrayToDataTable([
          ['School', 'Speciaal-praktijk-kader', 'VMBO-kader', 'VMBO-T-voorheen MAVO', 'VMBO-T/HAVO', 'HAVO', 'HAVO/VWO', 
      'VWO'],
      ['De Ster', 1, 0, 0, 0, 3, 0, 1], ['OBS Driespan', 8, 3, 13, 1, 27, 0, 20] ]);



        var schoolUitstroomOpties = {
        'title':'Uitstroom basisscholen #schooljaar 2014-2015 @Harkstede',
        isStacked: 'percent',
        legend: {position: 'right', maxLines: 3},

        vAxis: {
          minValue: 0, 
          ticks: [0, .2, .4, .6, .8, 1]
          },


        'chartArea': {left:40,'width': '80%', 'height': '80%'},
        animation:{
        startup: true,
        duration: 2000,
        easing: 'out', },
    };

        var schoolUitstroomChart = new google.visualization.ColumnChart(document.getElementById('uitstroom_basisschool'));


      google.visualization.events.addOneTimeListener(schoolUitstroomChart, 'ready', selectHandler);

    var aantalScholen = data.getNumberOfRows()
      function selectHandler() {
      console.log ('schoolUitstroomChart is ready en er zijn ' + (aantalScholen) + ' scholen');
        }


        schoolUitstroomChart.draw(data, schoolUitstroomOpties);


    $(window).resize(function(){
        TekenBasisschoolUitstroom();
        }); 
  }

仍然在gdb中,在第三条指令执行之前和之后都看到相同的值(0)。

h_vals:
    resq 99999

为什么当我尝试检查存储的地址时,我仍然看到0?

1 个答案:

答案 0 :(得分:2)

mov显然会移动数据;如果失败,你的程序会出现段错误。

没有调试信息的符号的默认大小是4个字节。您可以使用ptype h_vals来检查gdb对它的看法。

请记住,即使您正在调试asm,gdb的语法也会像C一样工作。在C中,通过那么多元素向指针偏移添加一些内容,而不是那么多字节。

&h_vals &h_vals + 8 * $rax未在gdb中评估您期望的地址。 (另外,我认为&h_vals &h_vals是一个错字,并不是你实际运行的。)

由于gdb认为&h_valsint*&h_vals + offset会产生4 *偏移的字节偏移,就像C中的h_vals[offset]一样。所以你的地址是gdb中的x amining实际上是[h_vals + 8 * 4 * rax]

另一种检查方式:p /x &h_valsp /x $rax。您可以自己计算出数学,并与x/输出中的地址进行比较。

此处最安全的解决方案是投放到char*

x /dg  8 * $rax + (char*)&h_vals

或者:在.c中定义符号,以便编译器为它们生成调试信息(因为您不想手动执行)。

e.g。将unsigned long h_vals[99999];放入使用gcc -c -g vars.c编译的.c中,并将生成的.o与.as YASM创建的.asm链接。