汇编语言学习笔记(6)

63.一般来说,需要暂存的数据,我们都应该使用栈.

64.offset是由编译器处理的符号,它的功能是取得标号的偏移地址.

 

65.ret和retf指令

     ret指令用栈中的数据,修改IP的内容,从而实现近迁移

     retf指令用栈中的数据,修改CS和IP的内容,从而实现远迁移.实际上一个是段内迁移,一个则可用于段之间的迁移.

 

66.CPU执行ret指令时,会进行下面的操作:

          a)  (IP)=((ss)*16+sp)

                (sp)=(sp)+2

 

67.CPU执行retf指令时,进行下面的操作:

          a)  (IP)=((ss)*16+sp)

          b)  (sp)=(sp)+2

          c)   (cs)=((ss)*16+(sp))

          d)   (sp)=(sp)+2

 

68.call指令:CPU执行call指令时进行两步操作:

          a)   将当前的IP或CS和IP压入栈中.

          b)   转移

 

69.div除法和mul乘法

     adc:带进位的加法指令

     sbb:带进位的减法指令

     cmp:比较指令,相当于减法,不保存结果,但是影响标志位.

 

70.最后一个知识点.包含多个段的程序.

     end:除了通知编译器结束外,还可以通知编译程序的入口在什么地方.

     数据,栈和代码放到不同的段中.

 

     assume    cs:code,ds:data,ss:stack

     data      segment

        dw   0123H,0456H,0789H,0abcH,0defH,0fedH

     data      ends

 

     stack     segment

        dw    0,0,0,0,0,0

     stack     ends

 

     code      segment

     start:     mov   ax,stack

                  mov  ss,ax

                   mov   sp,16     //设置栈顶

                  mov    ax,data

                   mov   ds,ax            //ds指向data段

                   mov    bx,0               //ds:bx指向第一个单元

                   mov    cx,8

         s:       push      [bx]

                  add        bx,2

                  loop       s     //所有数据入栈

                   mov   bx,0

                   mov   cx,8

         s0:      pop      [bx]

                   add      bx,2

                  loop      s0

                  mov   ax,4c00H

                   int      21H

      code      ends

       end     start

注释:

a)定义多个段的方法:和普通的定义段没有区别,只是不同的段需要取不同的名字.

b)对段地址的引用,在程序中,段名就相当于一个标号,它代表了段地址.

                           mov       ax,data              

    一个段中的段地址可由段名代表,偏移地址就要看在段中的位置.

c)代码段,数据段和栈段完全是自己设定的,即设定相应的寄存器.

 

想更深入的学习就需要继续研究...OVER...!

你可能感兴趣的:(c,汇编,语言,编译器)