汇编语言基础知识(四)

1.ret指令用栈中的数据,修改IP内容,从而实现转移。retf指令也是根据栈中的内容,修改CS和IP的内容,进行控制转移。

2.call指令将当前的IP或CS和IP压入栈中,然后进行跳转。

3.call命令被送到cpu指令缓存的时候,IP已经指向了call命令下一条指令,cpu执行call令后,是将call命令的下一条指令存储到了栈中。

4.我们可以通过call指令和ret指令配合,实现函数的跳转,也就是子程序的调用。

5. call 标号比如call code(标号),call可以根据位移进行转移。这样代码无论放到哪里都可以正确执行,但是转移的的偏移量有最大限制。

6.可以直接call一个目的地址比如call far ptr 标号。

7.call 16为寄存器也是可以的,寄存器中存放转移地址。

8.call也可以直接读取内存中的地址进行转移,比如call word ptr ds:[0],相当于进行了push ip;jmp word ptr。

9.call dword ptr ds:[0]相当于push cs;push ip;jmp dword ptr 内存地址。

10.子程序可以通过寄存器接受参数,通过寄存器保存结果,但是更通用的做法应该是用栈。

11.为了解决主程序和子程序中寄存器冲突,也就是同一个寄存器在两个程序中使用的问题。子程序在执行前,需要把所有用到的寄存器保存到栈中,执行后恢复寄存器中的内容,然后再返回。

12.两个数相乘要么是8位,要么是16位,不能8位和16位相乘。

13.如果是8位,一个默认放到AL中,另一个放到8位reg或内存字节单元中。如果是16位,一个默认在AX中,另一个放到16位reg或者内存字单元中。结果8位乘法放到AX中,16位乘法高位放到DX,地位放到AX中。

14.mov [di].2,dx 把dx中的内容放到di+2的内存地址中。

15.标志寄存器中的每一个位都代表一个标记。8086cpu中0,2,4,6,7,8,9,10,11位是有特殊含义的,其他位保留没有含义。

16.ZF标志如果执行当前指令,结果是0那么zf=1,不是0则zf=0。不是所有指令都会设置zf标志,比如mov,push,pop。这些数据转移的指令不会设置zf标志。add sub mul div inc or and这些对数据进行操作的指令会设置zf标志。

17.PF标志,其结果的所有bit位中1的个数是否为偶数,是pf=1,不是(奇数),pf = 0。

18.SF标志是符号标记为,也就是它只负责有符号数的逻辑意义,sf=1为负数,sf=0非负。这里需要强调一下,对于cpu它是不会区分有符号和无符号的,这些都是程序员逻辑上的划分。当两个有符号的数进行相加溢出后,cpu依然会根据结果设定sf。但是这时候的sf标志是错误的。甚至我们在做无符号运算的时候sf标志也会设置,只是我们逻辑上不会去使用sf标志位而已。

19.CF标志位是针对无符号数使用的,加法的进位,减法的借位都会设置CF=1,没有进位或者借位CF=0。

20.OF标志只针对有符号数,如果出现溢出OF=1,没有则OF=0。

21.adc是带进位的加法指令,adc ax,bx = (ax) + (bx) + CF。

22.为什么要设计adc加法指令呢,如果两个数都超过了16位,我们可以先将低16位相加,然后在用adc执行进行高位相加,这样就可以实现任意大的数据的加法运算。

23.sbb可以实现任意大的数据减法。

24.cmp指令,实际上是将两个操作数进行相减,然后通过标记位判断两个数的大小关系。

25.cmp指令针对无符号数和有符号数判断的标记位不同。无符号数的逻辑是,zf = 1,(ax) = (bx)。 zf = 0,(ax) != (bx)。

cf = 1, (ax) < (bx)。cf = 0,(ax) >= (bx)。cf = 0 && zf = 0,(ax) > (bx)。 cf = 1 or zf = 1,(ax) <= (bx)。

25.cmp指令针对有符号数,因为sf存在溢出的情况,所以不能只通过sf判断两个数的大小。要结合of进行判断。

26.sf = 1 && of = 0,说明没有溢出(ah)<(bh),sf = 1 && of = 1,(ah) > (bh)如果因为溢出导致了实际结果位负,那么逻辑上真正的结果必然为正。比如34-(-96) = 130,130溢出了,cpu当作有符号数解释为-126,所以sf = 1,但是34 > -96。如果sf = 0 &&of = 1。如果因为溢出导致了实际结果为正,那么逻辑上的真正结果必然为负。(ah) < (bh)。如果sf = 0 && of = 0,则说明(ah) >= (bh)。

27.cmp指令通常和转移指令配合使用。比如cmp ah,bh; je s;。

28.无符号数的转移指令je(等于则转移),jne(不等于则转移),jb(低于则转移),jnb(不低于则转移),ja(高于则转移),jna(不高于则转移)。

29.条件转移指令实际上是根据标志位进行判断是否转移的,所以理论上即使不用cmp,其他指令改变了标记为,也会影响转移指令的结果。

30.DF标志位,是方向标志位。df=0 每次操作后si,di递增。df=1 每次操作后si,di递减。cld指令设置df = 0。std指令设置df = 1。

31.movsb指令将ds:si指定的内容拷贝到es:di的位置。如果df=0则si = si + 1,di  = di + 1。df = 1则si = si - 1; di = di - 1。

32.movsw和movsb类似只不过每一次偏移两个字节。

33.串传送指令(movsw,movsb)一般会和rep指令共同完成传输操作。比如rep movsb相当于s:move sb;loop s。rep的次数根据CX的值决定。

34.pushf是将标志寄存器的值压栈,popf是将栈中弹出的数据,送入标志寄存去。它们两个位直接访问状态寄存器,提供了一种方法。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值