汇编学习(六)8086汇编拾遗 (5)

本是古典 何须时尚 2022-08-22 13:24 301阅读 0赞
  1. 8086 标志寄存器
  2. 8086 的最后一个比较重要的寄存器 标志寄存器
  3. 状态寄存器的三种作用:
  4. @用来存储相关指令的某些执行结果
  5. @用来为CPU执行相关指令提供行为依据
  6. @用来控制CPU的相关工作方式
  7. ZF标志:
  8. 记录相关指令执行后,其结果是否为0,结果为0,zf = 1,不为0 zf = 0.
  9. PF标志:
  10. 奇偶效验寄存器,记录相关指令执行后,其中所有位中1 的个数是否为偶数,如果1是偶数,pf = 1,如果为奇数pf = 0.
  11. SF标志:
  12. 记录相关指令执行后,其结果是否为负,如果为负,sf = 1,否则 sf = 0.在计算机看来,是不分数字的正负的,完全就是靠标志寄存器的SF 的标志的,决定正负数的运算。
  13. CF标志:
  14. 进位标志:一般情况下,再进行无符号运算的时候,它记录了,运算结果的最高有效位,向更高有效位的进位或者借位。
  15. OF标志:
  16. 溢出指令,再进行有符号数运算的时候,如果超过了机器所能表示的范围称为溢出。
  17. adc 指令:
  18. adc是带进位加法指令,它利用了CF位上记录的进位值。
  19. 指令格式:adc 操作对象1,操作对象2
  20. 实现功能:(ax) = (ax) + (bx) +CF
  21. 这条指令其实就是为了大数相而确定的,例如1EF000H + 201000H,结果高16ax,低16bx 中。
  22. mov ax,001EH mov bx,F000H add bx,1000H adc ax,0020H

128位数字加法:

  1. add128:
  2. push ax
  3. push cx
  4. push si
  5. push di
  6. sub ax,ax
  7. mov cx,8
  8. S:mov ax,[si]
  9. adc ax.[di]
  10. mov [si],ax
  11. inc si
  12. inc si
  13. inc di
  14. inc di
  15. loop S
  16. pop di
  17. pop si
  18. pop cx
  19. pop ax
  20. ret

sbb 指令 带借位减法指令,它利用了CF位上记录的借位值 指令格式: sbb 操作对象1,操作对象2 实现功能:(ax) = (ax) - (bx) -CF cmp 比较指令 比较指令,其实采用的是减法原理比较的。 首先无符号比较: 很简单,参考是否借位就能比较了。 cmp ax,bx zf = 1,ax = bx zf = 0,ax != bx cf = 1,ax < bx cf = 0,ax >= bx cf = 0 and zf = 0,ax > bx cf = 1 or zf = 1 ax <= bx 对于有符号数的比较: cmp ah,bh sf = 1 而 of = 0 ah < bh sf = 1 而 of = 1 ah > bh sf = 0 而 of = 1 ah < bh sf = 0 而 of = 0 ah > bh 检测比较结果的条件转移指令 转移指令根据无符号的比较结果进行转移的条件转移指令 je 等与则转移 zf == 1 jne 不等与则转移 zf = 0 jb 低于则转移 cf = 0 jnb 不低于则转移 cf = 0 ja 高与则转移 cf = 0 zf = 0 jna 不高于则转移 cf = 1 或 zf = 1 DF 标志 向量标志位:在串指令中,控制每次操作后si,di的增减。 df = 0 每次操作后 si di 递增 df = 1 每次操作后si di 递减 movsb movsw 指令相当于以下的几步操作: movsb : ((es)*16 + (di)) = ((ds)*16 + (si)) if(df == 0) (si) = (si) +1 (di) = (di)+1 if(df == 1) (si) = (si)-1 (di) = (di)-1 rep :循环指令 ,一般和movsb movsw 连用 如何决定df 的值,8086又有两个新的专门指令 cld : 设置df = 0 std: 设置df = 1 两个小例子: 将data段中的第一个字符串复制到它后面的空间中

  1. mov ax,data
  2. mov ds,ax
  3. mov si,0
  4. mov es,ax
  5. mov di,16
  6. mov cx,16
  7. cld
  8. rep movsb

使用传送指令,将F000H段中的最后16个字符复制到data 段中。

  1. mov ax,0f000h
  2. mov ds,ax
  3. mov si,0ffffh
  4. mov ax,data
  5. mov es,ax
  6. mov di,15
  7. mov cx,16
  8. std
  9. rep movsb

终于最后两个指令了,好累 pushf 和 popf 着两个命令是将标志寄存器压栈,弹栈送入寄存器标志中的命令。只有这两种放方法我们能访问寄存器。 debug 中寄存器的标志位: 标志 1 0 OF OV NF DF DN UP SF NG PL ZF ZR NZ PF PE PO CF CY NC 编写一个程序将以0结尾的字符串小写变大写

  1. assume cs:code
  2. data segment
  3. db "Bejing Tian An Men",0
  4. data ends
  5. code segment
  6. start:
  7. mov ax,data
  8. mov ds,ax
  9. mov si,0
  10. call letterc
  11. mov ax,4c00h
  12. int 21h
  13. letterc:
  14. push ax
  15. push bx
  16. push cx
  17. push dx
  18. S:mov ax,ds:[si]
  19. cmp ax,0
  20. je f
  21. inc si
  22. cmp al,'a'
  23. jb S
  24. cmp al.'z'
  25. ja S
  26. add al,'A'-'a'
  27. mov ds:[si-1],al
  28. jmp S
  29. f:
  30. pop dx
  31. pop cx
  32. pop bx
  33. pop ax
  34. code ends
  35. end start

发表评论

表情:
评论列表 (有 0 条评论,301人围观)

还没有评论,来说两句吧...

相关阅读