pcasm书的例子

时间:2012-07-23 00:45:11

标签: assembly x86 nasm

我是x86汇编语言的新手。我正在读一本名为pcasm的书,我想知道是否有人可以帮助我更好地理解这个代码示例(这是本书中的部分代码):

32    mov    ebx, input2
33    mov    ecx, $ + 7
34    jmp    short get_int
35
36    mov    eax, [input1]


64    get_int:
65        call   read_int
66        mov    [ebx], eax
67        jmp    ecx

现在,据我所知,$给出了当前地址,但是:

  1. 为什么+ 7
  2. 我该如何计算?
  3. 如果我使用jmp near get_int(4个字节)和jmp near word get_int(2个字节),该数字会怎样?第二种语法是正确的还是jmp word get_int
  4. 由于

2 个答案:

答案 0 :(得分:2)

  1. 示例代码使用+ 7,因为可能有7个字节的机器代码为源代码行33和34组合而生成。

  2. 您可以通过查看汇编程序输出列表(您可能需要在汇编程序中打开它)并计算字节数来计算所需的偏移量。

  3. 如果使用汇编到不同数量的机器代码字节的指令,则所需的偏移量将不同。您必须在您的环境中尝试查看所需内容。

答案 1 :(得分:2)

是的,我认为卡特博士正在努力实现“召唤”的目的......以及为什么我们使用“召唤”而不是这样做。“/ p>

如果在命令行中添加“-l myfile.lst”,Nasm将为您创建一个列表文件。

立即“jmp”的语法是“jmp short”和“jmp near”。 (还有“jmp far”但它做了一些不同的事情 - 在32位代码中通常不常用)。多年来,Nasm的行为在这方面发生了变化 - 如果你只是说“jmp”,那么老的Nasm默认会给你“jmp near” - 如果它适合的话,新的Nasm会使用“jmp short”。您可能需要使用“jmp strict near”在新的Nasm中实际获得“near jmp”(或者在命令行中使用“-O0” - 大写“o”,零 - 以关闭优化)。这是打破现有代码的事情。硬编码偏移“+7”是“不可维护”代码。我确信卡特博士提出了一个观点,而不是敦促你以这种方式编码!

作为此代码与“call / ret”之间的“中间”,尝试将标签放在您希望子程序返回的位置,并将其放在ecx中。如果你想从多个地方“不调用”这个子程序,你将不得不做“ret_addr1:”,“ret_addr2:”等。当然,你必须不要改变子程序中的ecx!使用“call / ret”,我们不得不陷入困境 - 通常是更好的权衡。

最佳, 弗兰克