我是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
现在,据我所知,$
给出了当前地址,但是:
+ 7
?jmp near get_int
(4个字节)和jmp near word get_int
(2个字节),该数字会怎样?第二种语法是正确的还是jmp word get_int
?由于
答案 0 :(得分:2)
示例代码使用+ 7
,因为可能有7个字节的机器代码为源代码行33和34组合而生成。
您可以通过查看汇编程序输出列表(您可能需要在汇编程序中打开它)并计算字节数来计算所需的偏移量。
如果使用汇编到不同数量的机器代码字节的指令,则所需的偏移量将不同。您必须在您的环境中尝试查看所需内容。
答案 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”,我们不得不陷入困境 - 通常是更好的权衡。
最佳, 弗兰克