<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[汇编语言基础学习-www.ryxxff.com]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/zaassd</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; zaassd]]></copyright><item><title><![CDATA[汇编语言CALL和RET指令：调用一个过程]]></title><link>https://blog.youkuaiyun.com/zaassd/article/details/94900272</link><guid>https://blog.youkuaiyun.com/zaassd/article/details/94900272</guid><author>zaassd</author><pubDate>Sat, 06 Jul 2019 21:50:00 +0800</pubDate><description><![CDATA[CALL 指令调用一个过程，指挥处理器从新的内存地址开始执行。过程使用 RET（从过程返回）指令将处理器转回到该过程被调用的程序点上。



从物理上来说，CALL 指令将其返回地址压入堆栈，再把被调用过程的地址复制到指令指针寄存器。当过程准备返回时，它的 RET 指令从堆栈把返回地址弹回到指令指针寄存器。32 位模式下，CPU 执行的指令由 EIP（指令指针寄存器）在内存中指岀。16 位模式下...]]></description><category></category></item><item><title><![CDATA[汇编语言PROC和ENDP伪指令：定义一个过程]]></title><link>https://blog.youkuaiyun.com/zaassd/article/details/94900890</link><guid>https://blog.youkuaiyun.com/zaassd/article/details/94900890</guid><author>zaassd</author><pubDate>Sat, 06 Jul 2019 21:49:58 +0800</pubDate><description><![CDATA[如果大家已经学过了高级编程语言，那么就会知道将程序分割为子过程（subroutine）是多么有用。一个复杂的问题常常要分解为相互独立的任务，这样才易于被理解、实现以及有效地测试。



在汇编语言中，通常用术语过程（procedure）来指代子程序。在其他语言中，子程序也被称为方法或函数。

就面向对象编程而言，单个类中的函数或方法大致相当于封装在一个汇编语言模块中的过程和数据集合。汇编语言出现...]]></description><category></category></item><item><title><![CDATA[汇编语言PUSH和POP指令（压栈和出栈）]]></title><link>https://blog.youkuaiyun.com/zaassd/article/details/94900203</link><guid>https://blog.youkuaiyun.com/zaassd/article/details/94900203</guid><author>zaassd</author><pubDate>Sat, 06 Jul 2019 21:49:55 +0800</pubDate><description><![CDATA[汇编里把一段内存空间定义为一个栈，栈总是先进后出，栈的最大空间为 64K。由于 "栈" 是由高到低使用的，所以新压入的数据的位置更低，ESP 中的指针将一直指向这个新位置，所以 ESP 中的地址数据是动态的。



PUSH 指令

PUSH 指令首先减少 ESP 的值，再将源操作数复制到堆栈。操作数是 16 位的，则 ESP 减 2，操作数是 32 位的，则 ESP 减 4。PUSH 指令有 ...]]></description><category></category></item><item><title><![CDATA[汇编语言运行时堆栈（内存数组）]]></title><link>https://blog.youkuaiyun.com/zaassd/article/details/94900566</link><guid>https://blog.youkuaiyun.com/zaassd/article/details/94900566</guid><author>zaassd</author><pubDate>Sat, 06 Jul 2019 21:49:54 +0800</pubDate><description><![CDATA[运行时堆栈是内存数组，CPU 用 ESP（扩展堆栈指针，extended stack pointer）寄存器对其进行直接管理，该寄存器被称为堆栈指针寄存器（stack pointer register）。



32位模式下，ESP 寄存器存放的是堆栈中某个位置的 32 位偏移量。ESP 基本上不会直接被程序员控制，反之，它是用 CALL、RET、PUSH 和 POP 等指令间接进行修改。

E...]]></description><category></category></item><item><title><![CDATA[汇编语言堆栈简介]]></title><link>https://blog.youkuaiyun.com/zaassd/article/details/94900128</link><guid>https://blog.youkuaiyun.com/zaassd/article/details/94900128</guid><author>zaassd</author><pubDate>Sat, 06 Jul 2019 21:49:51 +0800</pubDate><description><![CDATA[如下图所示，如果把 10 个盘子垒起来，其结果就称为堆栈。虽然有可能从这个堆栈的中间移出一个盘子，但是，更普遍的是从顶端移除。新的盘子可以叠加到堆栈顶部，但不能加在底部或中部。





堆栈数据结构（stack data structure）的原理与盘子堆栈相同：新值添加到栈顶，删除值也在栈顶移除。通常，对各种编程应用来说，堆栈都是有用的结构，并且它们也容易用面向对象的编程方法来实现。

如果...]]></description><category></category></item><item><title><![CDATA[汇编语言直接偏移量操作数]]></title><link>https://blog.youkuaiyun.com/zaassd/article/details/94590854</link><guid>https://blog.youkuaiyun.com/zaassd/article/details/94590854</guid><author>zaassd</author><pubDate>Wed, 03 Jul 2019 21:55:12 +0800</pubDate><description><![CDATA[变量名加上一个位移就形成了一个直接 – 偏移量操作数。这样可以访问那些没有显式标记的内存位置。假设现有一个字节数组 arrayB：



arrayB BYTE 10h,20h,30h,40h,50h

用该数组作为 MOV 指令的源操作数，则自动传送数组的第一个字节：

mov al,arrayB ;AL = 10h

通过在 arrayB 偏移量上加 1 就可以访问该数组的...]]></description><category></category></item><item><title><![CDATA[汇编语言XCHG指令：交换两个操作数内容]]></title><link>https://blog.youkuaiyun.com/zaassd/article/details/94590915</link><guid>https://blog.youkuaiyun.com/zaassd/article/details/94590915</guid><author>zaassd</author><pubDate>Wed, 03 Jul 2019 21:55:09 +0800</pubDate><description><![CDATA[XCHG（交换数据）指令交换两个操作数内容。该指令有三种形式：



XCHG reg, reg
XCHG reg, mem
XCHG mem, reg

除了 XCHG 指令不使用立即数作操作数之外，XCHG 指令操作数的要求与《MOV指令》一节中介绍的 MOV 指令操作数要求是一样的。

在数组排序应用中，XCHG 指令提供了一种简单的方法来交换两个数组元素。下面是几个使用 XCHG 指令的...]]></description><category></category></item><item><title><![CDATA[汇编语言LAHF和SAHF指令]]></title><link>https://blog.youkuaiyun.com/zaassd/article/details/94590845</link><guid>https://blog.youkuaiyun.com/zaassd/article/details/94590845</guid><author>zaassd</author><pubDate>Wed, 03 Jul 2019 21:55:06 +0800</pubDate><description><![CDATA[LAHF（加载状态标志位到 AH）指令将 EFLAGS 寄存器的低字节复制到 AH。被复制的标志位包括：符号标志位、零标志位、辅助进位标志位、奇偶标志位和进位标志位。使用这条指令，可以方便地把标志位副本保管在变量中：




  .data  saveflags BYTE ?  .code  lahf                      ;将标志位加载到 AH  mov saveflags...]]></description><category></category></item><item><title><![CDATA[汇编语言MOVZX和MOVSX指令]]></title><link>https://blog.youkuaiyun.com/zaassd/article/details/94590893</link><guid>https://blog.youkuaiyun.com/zaassd/article/details/94590893</guid><author>zaassd</author><pubDate>Wed, 03 Jul 2019 21:55:03 +0800</pubDate><description><![CDATA[尽管 MOV 指令不能直接将较小的操作数复制到较大的操作数中，但是程序员可以想办法解决这个问题。假设要将 count（无符号，16 位）传送到 ECX（32 位），可以先将 ECX 设置为 0，然后将 count 传送到 CX：




  .data  count WORD 1  .code  mov ecx,0  mov cx,count

如果对一个有符号整数 -16 进行同样的操作会发生...]]></description><category></category></item><item><title><![CDATA[汇编语言MOV指令：将源操作数复制到目的操作数]]></title><link>https://blog.youkuaiyun.com/zaassd/article/details/94590834</link><guid>https://blog.youkuaiyun.com/zaassd/article/details/94590834</guid><author>zaassd</author><pubDate>Wed, 03 Jul 2019 21:55:00 +0800</pubDate><description><![CDATA[MOV 指令将源操作数复制到目的操作数。作为数据传送（data transfer）指令，它几乎用在所有程序中。在它的基本格式中，第一个操作数是目的操作数，第二个操作数是源操作数：



MOV destination,source

其中，目的操作数的内容会发生改变，而源操作数不会改变。这种数据从右到左的移动与 C++ 或 Java 中的赋值语句相似：

dest = source;

在几乎所...]]></description><category></category></item><item><title><![CDATA[汇编语言操作数类型]]></title><link>https://blog.youkuaiyun.com/zaassd/article/details/94590820</link><guid>https://blog.youkuaiyun.com/zaassd/article/details/94590820</guid><author>zaassd</author><pubDate>Wed, 03 Jul 2019 21:54:58 +0800</pubDate><description><![CDATA[x86 的指令格式为：



[label:] mnemonic [operands][ ;comment ]

指令包含的操作数个数可以是：0 个，1 个，2 个或 3 个。这里，为了清晰起见，省略掉标号和注释：

mnemonic
mnemonic [destination] mnemonic [destination] , [source] mnemonic [destination] ,...]]></description><category></category></item><item><title><![CDATA[汇编语言整数加减法示例]]></title><link>https://blog.youkuaiyun.com/zaassd/article/details/94208721</link><guid>https://blog.youkuaiyun.com/zaassd/article/details/94208721</guid><author>zaassd</author><pubDate>Sat, 29 Jun 2019 21:22:17 +0800</pubDate><description><![CDATA[在《第一个汇编语言程序》一节中给出的 AddTwo 程序，并添加必要的声明使其成为完全能运行的程序。




  ; AddTwo.asm -两个 32 位整数相加    .386  .model flat,stdcall  .stack 4096  ExitProcess PROTO, dwExitCode:DWORD    .code  main PROC  mov  eax,5  ;将数字...]]></description><category></category></item><item><title><![CDATA[汇编语言指令详解]]></title><link>https://blog.youkuaiyun.com/zaassd/article/details/94208329</link><guid>https://blog.youkuaiyun.com/zaassd/article/details/94208329</guid><author>zaassd</author><pubDate>Sat, 29 Jun 2019 21:21:59 +0800</pubDate><description><![CDATA[指令（instruction）是一种语句，它在程序汇编编译时变得可执行。汇编器将指令翻译为机器语言字节，并且在运行时由 CPU 加载和执行。



一条指令有四个组成部分：

标号（可选）
	指令助记符（必需）
	操作数（通常是必需的）
	注释（可选）
不同部分的位置安排如下所示：

[label: ] mnemonic [operands] [;comment]

现在分别了解每个部分，先从标...]]></description><category></category></item><item><title><![CDATA[汇编语言伪指令]]></title><link>https://blog.youkuaiyun.com/zaassd/article/details/94208418</link><guid>https://blog.youkuaiyun.com/zaassd/article/details/94208418</guid><author>zaassd</author><pubDate>Sat, 29 Jun 2019 21:21:41 +0800</pubDate><description><![CDATA[伪指令 (directive) 是嵌入源代码中的命令，由汇编器识别和执行。伪指令不在运行时执行，但是它们可以定义变量、宏和子程序；为内存段分配名称，执行许多其他与汇编器相关的日常任务。



默认情况下，伪指令不区分大小写。例如，.data，.DATA 和 .Data 是相同的。

下面的例子有助于说明伪指令和指令的区别。DWORD 伪指令告诉汇编器在程序中为一个双字变量保留空间。另一方面，MO...]]></description><category></category></item><item><title><![CDATA[汇编语言标识符及其命名规则]]></title><link>https://blog.youkuaiyun.com/zaassd/article/details/94208240</link><guid>https://blog.youkuaiyun.com/zaassd/article/details/94208240</guid><author>zaassd</author><pubDate>Sat, 29 Jun 2019 21:21:24 +0800</pubDate><description><![CDATA[标识符（identifier）是由程序员选择的名称，它用于标识变量、常数、子程序和代码标签。



标识符的形成有一些规则：

可以包含 1 到 247 个字符。
	不区分大小写。
	第一个字符必须为字母 (A—Z, a—z) A 下划线 (_)、@、? 或 $。其后的字符也可以是数字。
	标识符不能与汇编器保留字相同。

提示：可以在运行汇编器时，添加 -Cp 命令行切换项来使得所有关键字和标...]]></description><category></category></item><item><title><![CDATA[汇编语言常量]]></title><link>https://blog.youkuaiyun.com/zaassd/article/details/94208509</link><guid>https://blog.youkuaiyun.com/zaassd/article/details/94208509</guid><author>zaassd</author><pubDate>Sat, 29 Jun 2019 21:21:07 +0800</pubDate><description><![CDATA[常量（constant）是程序中使用的一个确定数值，在汇编阶段就可以确定，直接编码于指令代码中，不是保存在存储器中可变的变量，因为是编码在指令中的量，和指令一起存储了，所以不用单独开辟主存空间，所以也就没法动态改变它了，这也正是高级语言常量无法修改的原因。



整数常量

整数常量（integer literal）（又称为整型常量（integer constant））由一个可选前置符号、一个或...]]></description><category></category></item><item><title><![CDATA[第一个汇编语言程序]]></title><link>https://blog.youkuaiyun.com/zaassd/article/details/94208173</link><guid>https://blog.youkuaiyun.com/zaassd/article/details/94208173</guid><author>zaassd</author><pubDate>Sat, 29 Jun 2019 21:20:41 +0800</pubDate><description><![CDATA[汇编语言以隐晦难懂而著名，但是本教程从另一个角度来看它——它是一种几乎提供了全部信息的语言。程序员可以看到正在发生的所有事情，甚至包括 CPU 中的寄存器和标志！



但是，在拥有这种能力的同时，程序员必须负责处理数据表示的细节和指令的格式。程序员工作在一个具有大量详细信息的层次。现在以一个简单的汇编语言程序为例，来了解其工作过程。

程序执行两个数相加，并将结果保存在寄存器中。程序名称为 A...]]></description><category></category></item><item><title><![CDATA[x86计算机组件]]></title><link>https://blog.youkuaiyun.com/zaassd/article/details/94208879</link><guid>https://blog.youkuaiyun.com/zaassd/article/details/94208879</guid><author>zaassd</author><pubDate>Sat, 29 Jun 2019 21:20:21 +0800</pubDate><description><![CDATA[本节首先通过检查典型主板配置以及围绕 CPU 的芯片组来了解 x86 如何与其他组件的集成。然后讨论内存、I/O 端口和通用设备接口。最后说明汇编语言程序怎样利用系统硬件、固件，并调用操作系统函数来实现不同访问层次的 I/O 操作。



主板

主板是微型计算机的心脏，它是一个平面电路板，其上集成了 CPU、支持处理器（芯片组（chipset））、主存、输入输出接口、电源接口和扩展插槽。

各...]]></description><category></category></item><item><title><![CDATA[64位x86-64处理器架构]]></title><link>https://blog.youkuaiyun.com/zaassd/article/details/94208094</link><guid>https://blog.youkuaiyun.com/zaassd/article/details/94208094</guid><author>zaassd</author><pubDate>Sat, 29 Jun 2019 21:19:58 +0800</pubDate><description><![CDATA[本节重点关注所有使用 x86-64 指令集的 64 位处理器的基本架构细节。这些处理器包括 Intel 64 和 AMD64 处理器系列。指令集是已讨论的 x86 指令集的 64 位扩展。以下为一些基本特征：



1) 向后兼容 x86 指令集。

2) 地址长度为 64 位，虚拟地址空间为 2 64 字节。按照当前芯片的实现情况，只能使用地址的低 48 位。

3) 可以使用 64 位通用寄...]]></description><category></category></item><item><title><![CDATA[32位x86处理器架构]]></title><link>https://blog.youkuaiyun.com/zaassd/article/details/94208610</link><guid>https://blog.youkuaiyun.com/zaassd/article/details/94208610</guid><author>zaassd</author><pubDate>Sat, 29 Jun 2019 21:19:38 +0800</pubDate><description><![CDATA[本节重点讲解了 32 位 x86 处理器的基本架构特点。这些处理器包括了 Intel IA-32 系列中的成员和所有 32 位 AMD 处理器。



操作模式

x86 处理器有三个主要的操作模式：保护模式、实地址模式和系统管理模式；以及一个子模式：虚拟 8086 (virtual-8086) 模式，这是保护模式的特殊情况。以下是对这些模式的简介：

1) 保护模式 (Protected Mo...]]></description><category></category></item></channel></rss>