x86汇编语言学习:第六章 相同的功能,不同的代码

采用不同的方法来实现和上一章相同的采用不同的方法来实现和实现和上一章相章相同的同功能

  1. 用一种不同的分段方法,从不同角度理解处理器的分段内存访问机制
  2. 学习循环和条件转移
  3. 新指令,movsb、movsw、inc、dec、cld、std、div、neg、cbw、cwd、sub、idiv、jcxz、cmp等
  4. INTEL8086标志寄存器FLAGS的各个标志位
  5. 计算机中的负数
  6. Bochs调试的更多技巧学习

6.2 跳过非指令的数据区

处理指令与非处理指令的数据之间夹杂,利用“jmp”来跳过数据区

6.3 在数据声明中使用字面值

mytext db 'L',0x07,'a',0x07,'b',0x07,'e',0x07,'l',0x07,' ',0x07,'o',0x07,\
            'f',0x07,'f',0x07,'s',0x07,'e',0x07,'t',0x07,':',0x07

6.4 段地址的初始化

规避古怪的写法

mov [0x7c00 + numbers + 0x00], dl

可以将DS的段地址初始化位0x7c00,即

mov ax, 0x7c00
mov ds, ax

原因:numbers是段偏移地址,而之前第5章的代码,段地址初始值一直为0,所以需要“古怪的写法”

6.5 段之间的批量数据传送

6.5.1 movsb和movsw指令

movsb和movsw(前者以字节为单位,后者以字为单位)

  • 原始数据串     由DS指定,偏移地址由SI指定,DS:SI
  • 目的地址      由ES:DI指定
  • 传送字节数或字数  由CX指定
  • 正向传送      传送操作的方向是从内存区域的低地址端到高地址端;SI++,DI++。
  • 反向传送      和正向传送相反;SI–,DI–。
    6.5.2 8086处理器的标志寄存器

其中第10位是方向标志,控制movsb和movsw的床送方向

6.5.3 std和cld指令
  • cld 无操作数指令,DF标志清零,以指示传送是正方向
  • std 将DF标志位置1,以指示传送的是反方向
    6.5.4 rep指令
    rep movsw
    ;rep前缀的意思是CX不为0,则重复后面的指令
    

    6.6 使用循环分解数位

    6.6.1 loop指令

    该指令的功能是重复执行一段相同的代码

loop digital
将寄存器CX的内容减一;
如果CX的内容不为0,转移到指定的位置处执行,否则顺序执行后面的语句;
6.6.2 inc指令和dec指令
  • inc指令为加一指令,但是比”add bx 1”的指令更短,速度更快
  • dec指令为减一指令

6.7 计算机中的负数

几乎所有的指令既能操作有符号数,又能操作无符号数。但是有几条指令除外,比如除法指令和乘法指令。

6.7.1 neg指令
  • neg指令带有一个操作数,可以是8位或者16位的寄存器,或者内存单元
  • 功能:用0减去指令中指定的操作数
    6.7.2 cbw和cbd指令
  • cbw,Convert Byte to Word,没有操作数,操作码为98  将寄存器AL中的符号数,扩展到整个AX
  • cbd,Convert Byte to Double-word,没有操作数,操作码为99  将寄存器AX中的有符号数扩展到DX:AX
    6.7.3 idiv指令
  • idiv指令,有符号除法指令

    6.8 数位的显示

    6.8.1 jns指令

    条件转移指令,处理器在执行它的时候,要参考标志寄存器的SF位

6.9 其它标志位和条件转移指令

6.9.1 奇偶标志位PF

当运算结果出来之后,如果最低8位中,有偶数个为1的比特,则PF=1;否则,PF=0。

6.9.2 进位标志CF

当处理器进行算术运算时,如果最高位有向前进位或者借位的操作发生,则CF=1;否则CF=0。

6.9.3 溢出标志OF

(在所有的情况下,处理器不知道进行的是无符号运算还是有符号运算,所以有了这个标志位) 该标志的意思是,假定你进行的是有符号运算,如果结果超出了目标操作数所能容纳的范围,OF=1;否则OF=0。

6.9.4 现有指令对标志位的影响

6.9.5 jcc条件转移指令簇
  • js :SF=1则转移
  • jz :ZF=1则转移
  • jo :OF=1则转移
  • jc :CF=1则转移
  • jp :PF=1则转移
  • jcxz :当CX寄存器为0是,转移
    6.9.6 cmp指令

    cmp指令在功能上和sub指令相同,唯一不同之处在于,cmp仅仅根据运算结果设置相应的标志位,而不保留计算结果

  • 目的操作数:通用寄存器或者内存单元
  • 源操作数 :通用寄存器,内存单元或者立即数 (两个操作数,不能同时为内存单元)

6.10 NASM编译器的$和$$

  • $ :该标记等同于标号,可以看成是一个隐藏在当前行行首的的标号
  • $ $ :代表当前汇编节(段)的其实汇编地址。如果没有定义汇编节,就默认地自成一个汇编段,而且起始汇编地址是0

6.12 本章程序的调试

以后单独拉出一个篇章,记录bochs的调试命令

Share: X (Twitter) Facebook LinkedIn