汇编语言第五章总结

时间:2022-08-25 04:54:10
  •  [bx]

    1.表示一个内存单元,它的偏移地址在bx中

mov ax,[bx]  ;内存的数据送入寄存器,此时bx中存放的数据作为一个偏移地址,段地址默认在ds中
mov [bx],ax  ;寄存器数据送入内存
  • loop指令

    1.该指令可以用来实现循环功能,cx中存放循环次数

    2.解释:

        (1)标号:实际上标识了一个地址(偏移地址)

        (2)loop s的执行:

                  先cx=cx-1;

                  再判断cx中的值,不为0则转至标号s所标识的地址处执行;若为零则执行下一条指令;

    3.格式:

        (1)在cx中存放循环次数

        (2)loop指令中的标号所标识地址要在前面

        (3)要循环执行的程序段,要写在标号和loop指令的中间

    mov cx,循环次数
s: 
    要循环执行的程序段
    loop s
  • 定义性描述符号()——表示一个寄存器或一个内存单元中的内容

    1. ()中的元素可以有三种类型:

        (1)寄存器名

        (2)段寄存器名

        (3)内存单元的物理地址(一个20位数据)

    2. ()中表示的数据可以有两种类型:

        (1)字节

        (2)字

  • 在debug中跟踪loop指令实现的循环程序

    1.用u反汇编程序,可以看到loop s中的标号s已经变成一个地址

    2.遇到loop指令时,使用p命令来执行,debug就会自动重复执行循环中的指令;也可以g命令直接执行

    3.注意:在汇编程序中,数据不能以字母开头,要在前面加0

  • debug和汇编编译器masm对指令的不同处理

    1. debug将[idata]解释为一个内存单元,idata是内存单元的偏移地址

    2.编译器将[idata]解释为idata

    3.在汇编程序中

        (1)想让[idata]用来表示内存单元,必须在[idata]的前面显式地给出段地址所在的段寄存器

mov  al , ds:[0]

        (2)在[ ]里面用寄存器,则间接给出内存单元的偏移地址,段地址默认在ds中,也可以显式地给出段地址所在的段寄存器

  • loop和[bx]的联合应用

    1.类型的匹配和结果的不超界的解决办法:用一个16位寄存器来做中介,将内存单元中的8位数据赋值到一个16位寄存器ax中,再将ax中的数据加到dx上。

mov  al , ds:[0]
mov  ah , 0
  • 段前缀

    1.用于显示式指明内存单元的段地址的“ds:”、“cs:”、“ss:”、“es:”等

  • 一段安全空间

    1. 我们向一段内存中写入内容,这段空间不应该存放系统或其他程序的数据或代码

 

(在csapp中关于循环的做法)

    1.利用了test指令来判断循环条件,有条件的跳转指令将使程序循环

    2.test s1,s2 —— s1&s2(与and功能一样,但其只设置条件码,不改变目的寄存器的值)

    3.jmp是无条件跳转,而除此之外的跳转指令都是有条件的(例如je 相等时;jne 不相等时;js 负数时;jg 大于时;jl 小于时等等)

    4.一些条件码:(除了leap,一般的指令都会设置条件码)

        (1)CF:进位标志

        (2)ZF:零标志

        (3)SF:符号标志

        (4)OF:溢出标志