<?xml version="1.0" encoding="gbk"?>
<rss version="2.0">
  <channel>
    <title>曲径通幽论坛 - 『 Assembly Language 』</title>
    <link>http://www.groad.net/bbs/forum.php?mod=forumdisplay&amp;fid=85</link>
    <description>Latest 20 threads of 『 Assembly Language 』</description>
    <copyright>Copyright(C) 曲径通幽论坛</copyright>
    <generator>Discuz! Board by Comsenz Inc.</generator>
    <lastBuildDate>Sun, 12 Jul 2026 10:04:34 +0000</lastBuildDate>
    <ttl>60</ttl>
    <image>
      <url>http://www.groad.net/bbs/static/image/common/logo_88_31.gif</url>
      <title>曲径通幽论坛</title>
      <link>http://www.groad.net/bbs/</link>
    </image>
    <item>
      <title>movsbl 和 movzbl</title>
      <link>http://www.groad.net/bbs/forum.php?mod=viewthread&amp;tid=5251</link>
      <description><![CDATA[movsbl 和 movzbl 是 mov 指令的两个扩展形式。

考虑两种情形的 C 代码以及相应的汇编代码：

MOVZBL：


对应的汇编代码：
[mw_shl_code=text,true]

movb    $-91, -1(%ebp)
movz ...]]></description>
      <category>『 Assembly Language 』</category>
      <author>beyes</author>
      <pubDate>Tue, 15 Nov 2011 08:03:20 +0000</pubDate>
    </item>
    <item>
      <title>pause 指令与 rep;nop</title>
      <link>http://www.groad.net/bbs/forum.php?mod=viewthread&amp;tid=3373</link>
      <description><![CDATA[rep;nop 指令是执行多个 nop 还是 1 个 nop?
本来，加上 rep 前缀是一直执行 rep 后的指令直到 ECX 中的值为 0 。在内核代码中，如在 spin_lock 的实现里，会看到 rep;nop 这样的语句，很容易想到会执行多个 nop 。但事实上它不是这样。看下面的演示程序：
[mw_shl_code ...]]></description>
      <category>『 Assembly Language 』</category>
      <author>beyes</author>
      <pubDate>Thu, 14 Apr 2011 03:37:42 +0000</pubDate>
    </item>
    <item>
      <title>BTS, BTR 指令说明</title>
      <link>http://www.groad.net/bbs/forum.php?mod=viewthread&amp;tid=3294</link>
      <description><![CDATA[BTS -- Bit Test and Set (位测试并置位)

BTS 指令先将指定位的值存储到 CF 标志中然后设置该位。

指令语法格式及举例：

说明：
Intel 指令格式和 AT&amp;A 指令格式顺序相反。这里按照 linux 里所用的 AT&amp;T 指令格式说明。其实这个指令解释起来拗口，但用起来却简单。举 ...]]></description>
      <category>『 Assembly Language 』</category>
      <author>beyes</author>
      <pubDate>Sat, 26 Mar 2011 15:52:43 +0000</pubDate>
    </item>
    <item>
      <title>lfence, sfence, mfence</title>
      <link>http://www.groad.net/bbs/forum.php?mod=viewthread&amp;tid=3246</link>
      <description><![CDATA[lfence, sfence, mfence 三条指令与乱序执行引起的内存屏障有关。所谓的乱序执行指令，是处理器为了提高性能，不按照指令原先顺序执行的一种优化形式。但是乱序也会带来副作用，下面进行一种假设的分析。

比如有以下代码(注意，下面代码在真实环境中也许不会得到因为乱 ...]]></description>
      <category>『 Assembly Language 』</category>
      <author>beyes</author>
      <pubDate>Sat, 19 Mar 2011 13:08:19 +0000</pubDate>
    </item>
    <item>
      <title>原子操作与 x86 上的 lock 指令前缀</title>
      <link>http://www.groad.net/bbs/forum.php?mod=viewthread&amp;tid=3152</link>
      <description><![CDATA[原子操作是不可分割的操作，在执行完毕时它不会被任何事件中断。在单处理器系统(UniProcessor，简称 UP)中，能够在单条指令中完成的操作都可以认为是原子操作，因为中断只能发生在指令与指令之间。


在多处理器系统(Symmetric Multi-Processor，简称 SMP)中情况有所不 ...]]></description>
      <category>『 Assembly Language 』</category>
      <author>beyes</author>
      <pubDate>Thu, 24 Feb 2011 03:18:53 +0000</pubDate>
    </item>
    <item>
      <title>伪指令 .previous</title>
      <link>http://www.groad.net/bbs/forum.php?mod=viewthread&amp;tid=3150</link>
      <description><![CDATA[.previous 伪指令，应该说是用来切换段(section)的。


看一段汇编代码：

使用 objdump 来看一下：

还有：


在 .previous 下的 0x9abc 被安排在了 .subsection1 下面。


再看另外一段汇编代码：

同样用 objdump 来观察：

还有：


由上面可见，.previous 下的 0xd ...]]></description>
      <category>『 Assembly Language 』</category>
      <author>beyes</author>
      <pubDate>Wed, 23 Feb 2011 08:33:25 +0000</pubDate>
    </item>
    <item>
      <title>操作数指示符</title>
      <link>http://www.groad.net/bbs/forum.php?mod=viewthread&amp;tid=3043</link>
      <description><![CDATA[有如下几种：


其中 \'near\' 和 \'far\' 不允许在多段编程(multi-segment programming)中直接使用(在 as86 汇编器下)。所有的远操作 (\'far\' operations)都明确的通过诸如 jmpi, jmpf, callf,retf 等指令来使用。近操作符(\'Near\' operator)用来强制实现80386 的 16 位条件 ...]]></description>
      <category>『 Assembly Language 』</category>
      <author>beyes</author>
      <pubDate>Sun, 09 Jan 2011 10:03:09 +0000</pubDate>
    </item>
    <item>
      <title>AT&amp;T 和 NASM 的一些区别</title>
      <link>http://www.groad.net/bbs/forum.php?mod=viewthread&amp;tid=3042</link>
      <description><![CDATA[GAS memory operand            NASM memory operand
------------------                          -------------------

100                                            [100]
%es:100                                    [es:100]
(%eax)                         ...]]></description>
      <category>『 Assembly Language 』</category>
      <author>beyes</author>
      <pubDate>Sat, 08 Jan 2011 02:13:15 +0000</pubDate>
    </item>
    <item>
      <title>硬编码</title>
      <link>http://www.groad.net/bbs/forum.php?mod=viewthread&amp;tid=3000</link>
      <description><![CDATA[对于 CPU 来说，它对指令和数据本质上是不区分的。数据也可以当成是指令，这也就是在缓冲区溢出的利用中，塞进去的是数据，但这些数据时经过精心构造过的，CPU 拿它们当指令来执行了。 

在硬编码的一个简单示例里，揭示了这一点。 

下面是一个普通的汇编程序： 
 
这 ...]]></description>
      <category>『 Assembly Language 』</category>
      <author>beyes</author>
      <pubDate>Fri, 24 Dec 2010 12:09:26 +0000</pubDate>
    </item>
    <item>
      <title>main 函数与 crt1.o 库</title>
      <link>http://www.groad.net/bbs/forum.php?mod=viewthread&amp;tid=2859</link>
      <description><![CDATA[先用 http://www.groad.net/bbs/read.php?tid-1391-fpage-3.html 中的 cpuid 作为例子来尝试下面的一个编译链接： 
 
上面使用 as 编译时没有问题，但在用 gcc 链接时出错了。提示出错的原因有两个，1 是没有定义 main 函数；2 是重复定义了 _start ，且这个 _start 在  ...]]></description>
      <category>『 Assembly Language 』</category>
      <author>beyes</author>
      <pubDate>Thu, 11 Nov 2010 00:44:22 +0000</pubDate>
    </item>
    <item>
      <title>无条件跳转指令 JMP</title>
      <link>http://www.groad.net/bbs/forum.php?mod=viewthread&amp;tid=2855</link>
      <description><![CDATA[JMP 是无条件跳转指令，有直接跳转和间接跳转两种。
 
直接跳转指令，跳转到的目标地址作为跳转指令的一部分直接编码到跳转指令中，其写法是给出跳转目标处的标号。
间接跳转指令，跳转的目的位置取自于某个寄存器或某个内存位置中，其写法是必须以一个星字符 \'*\' 作为 ...]]></description>
      <category>『 Assembly Language 』</category>
      <author>beyes</author>
      <pubDate>Wed, 10 Nov 2010 16:08:23 +0000</pubDate>
    </item>
    <item>
      <title>内联汇编</title>
      <link>http://www.groad.net/bbs/forum.php?mod=viewthread&amp;tid=2630</link>
      <description><![CDATA[基本格式：


简单举例：
书写格式 1：

上面使用转义字符 \\n 和 \\t 。这样看起来很凌乱，改成如下格式则较为清晰：

上面将指令放在单独的行中。这样做，每条指令必须括在引号里。这种格式容易阅读，在调试时也感觉轻松。asm 段可以放在 C 或 C++ 源代码中的任何地方。 ...]]></description>
      <category>『 Assembly Language 』</category>
      <author>beyes</author>
      <pubDate>Mon, 23 Aug 2010 06:37:02 +0000</pubDate>
    </item>
    <item>
      <title>使用 Linux 系统调用</title>
      <link>http://www.groad.net/bbs/forum.php?mod=viewthread&amp;tid=2622</link>
      <description><![CDATA[在汇编的最后，经常会看到: 
 
这实际上是调用了 Linux 的第 1 号系统调用 exit 函数。movl $1, %eax 中的 1 表示 1 号系统调用；0 表示传递给 exit 的参数。int $0x80 是调用中断 0x80 。 

系统调用号可以在 /usr/include/asm/unistd.h 中找到。在较新的 Linux 发行版 ...]]></description>
      <category>『 Assembly Language 』</category>
      <author>beyes</author>
      <pubDate>Sun, 22 Aug 2010 02:40:34 +0000</pubDate>
    </item>
    <item>
      <title>命令行参数</title>
      <link>http://www.groad.net/bbs/forum.php?mod=viewthread&amp;tid=2609</link>
      <description><![CDATA[1. Linux 如何从命令行执行程序
从 shell 中运行程序时，系统会为要执行的程序在内存中创建一个区域。分配给程序的内存区域可以位于物理内存的任何位置。为了使这一过程简化，每个程序都被分配相同的虚拟内存地址。虚拟内存地址由操作系统映射到物理内存地址。

在 Linu ...]]></description>
      <category>『 Assembly Language 』</category>
      <author>beyes</author>
      <pubDate>Thu, 19 Aug 2010 15:27:50 +0000</pubDate>
    </item>
    <item>
      <title>使用独立函数文件</title>
      <link>http://www.groad.net/bbs/forum.php?mod=viewthread&amp;tid=2607</link>
      <description><![CDATA[1. 声明函数
函数也可以不用和主程序放在同一个文件里，可以将其单独放在一个文件中。为了其他程序能够访问到这个文件里的函数，必须把函数名声明为全局标签：

2. 创建可执行文件
假设主程序文件名为 main.s ，函数所在文件的文件名为 area.s ，可以如下编译链接：

3. ...]]></description>
      <category>『 Assembly Language 』</category>
      <author>beyes</author>
      <pubDate>Thu, 19 Aug 2010 14:27:51 +0000</pubDate>
    </item>
    <item>
      <title>汇编函数与 C 样式传递数据</title>
      <link>http://www.groad.net/bbs/forum.php?mod=viewthread&amp;tid=2602</link>
      <description><![CDATA[在大多数 C 语言编译器中，对于函数参数的传递，局部变量的存放，函数的返回等处理都使用标准方法处理，这种方法也适用于汇编语言。

在 C 语言中，传递函数参数的方法是使用堆栈。主程序和任何函数都可以使用堆栈。堆栈就是主程序和函数之间传递数据的桥梁。同样，对于 ...]]></description>
      <category>『 Assembly Language 』</category>
      <author>beyes</author>
      <pubDate>Wed, 18 Aug 2010 14:12:07 +0000</pubDate>
    </item>
    <item>
      <title>汇编函数的定义</title>
      <link>http://www.groad.net/bbs/forum.php?mod=viewthread&amp;tid=2600</link>
      <description><![CDATA[在源代码文件中，汇编函数里的指令必须和主程序的其余指令分开。为了在 GNU 汇编器中定义函数，必须在程序中把函数名称声明为标签。为汇编器声明函数名称，可以使用 .type 命令：

上面定义告诉汇编器，函数从 func1 标签处开始。在函数中，可以访问寄存器和内存位置， ...]]></description>
      <category>『 Assembly Language 』</category>
      <author>beyes</author>
      <pubDate>Wed, 18 Aug 2010 05:20:01 +0000</pubDate>
    </item>
    <item>
      <title>扫描字符串(SCAS指令)</title>
      <link>http://www.groad.net/bbs/forum.php?mod=viewthread&amp;tid=2599</link>
      <description><![CDATA[有时候扫描字符串搜索特定字符或者字符序列是有用的。使用 LODS 遍历字符串虽然可以，但比较耗时。Intel 提供了 SCAS 指令用以搜索字符串中特定的一个字符或者一组字符的方式。SCAS 指令有 3 种方式：
SCASB : 比较内存中的一个字节和 AL 寄存器中的值SCASW :  比较内存 ...]]></description>
      <category>『 Assembly Language 』</category>
      <author>beyes</author>
      <pubDate>Tue, 17 Aug 2010 10:01:57 +0000</pubDate>
    </item>
    <item>
      <title>字符串比较(CMPS指令)</title>
      <link>http://www.groad.net/bbs/forum.php?mod=viewthread&amp;tid=2596</link>
      <description><![CDATA[CMPS 系列指令用于比较字符串值，和其他字符串指令一样，CMPS 有 3 种格式：
CMPSB: 比较字节值CMPSW: 比较字(2字节)值CMPSL: 比较双字(4字节)值和其他字符串指令一样，隐含的源和目标操作数的位置同样存储在 ESI 和 EDI 中。每次执行 CMPS 指令时，根据 DF 标志的设置 ...]]></description>
      <category>『 Assembly Language 』</category>
      <author>beyes</author>
      <pubDate>Tue, 17 Aug 2010 05:14:35 +0000</pubDate>
    </item>
    <item>
      <title>存储和加载字符串(LODS和STOS)</title>
      <link>http://www.groad.net/bbs/forum.php?mod=viewthread&amp;tid=2594</link>
      <description><![CDATA[除了把字符串从一个内存位置传送到另一个内存位置外(MOVS 指令)，还有用于把内存中的字符串值加载到寄存器中以及传回内存位置中的指令。

LODS 指令用于把内存中的字符串值传送到 EAX 中，其格式为：
LODSB: 把一个字节加载到 AL 中LODSW: 把一个字(2字节)加载到 AX 中L ...]]></description>
      <category>『 Assembly Language 』</category>
      <author>beyes</author>
      <pubDate>Mon, 16 Aug 2010 16:19:44 +0000</pubDate>
    </item>
  </channel>
</rss>