汇编 ---- 第六章 栈和寻址方式

第一节 显示字符串

		jmp near start
message db '1+2+3+···+100='
;字符串
;==db '1','+','2','+','3','+','·','+','·','+','·','+','100','='
start:
	mov ax, 0x7c0
	mov ds, ax
	;访问内存单元,7c0为访问内存开始的位置
	mov ax, 0xb800
	;访问显存,b800为访问显存开始的位置
	mov es, ax
	mov si,message
	mov di,0
	mov cx, start-message
  @g:
	mov al, [si]
	;[si](ds:si)指向db指令所声明的第一个存储单元
	;将字符1的ACSII码存入al寄存器中
	mov [es:di], al
	;[es:di]指向显存的第一个存储单元
	;将字符1的ASCII码存入显存的第一个存储单元
	inc di
	;为下一行代码存入字符属性提前做好准备
	mov byte [es:di], 0x07
	inc di
	inc si
	;为下一次循环提前做好准备
	loop @g

第二节 1到100的累加

		xor ax, ax
		mov cx, 1
    @f:
        add ax, cx;0+1+2+3+···+100
        inc cx    ;2->3->4->···->100->101
        cmp cx, 100
        jle @f
        ;小于等于则跳转

第三节 JLECMP

  • 以下条件转移用于无符号数据:

    • 符号说明测试的标志
      JE/JZ相等则转移或为零则转移ZF
      JNE/JNZ不相等则转移或不为零则转移ZF
      JA/JNBE高于则转移或不低于等于则转移CF,ZF
      JAE/JNB高于等于则转移或不低于则转移CF
      JB/JNAE低于则转移或不高于等于则转移CF
      JBE/JNA低于等于则转移或不高于则转移AF,CF
  • 以下条件转移用于有符号数

    • 符号说明测试的标志
      JE/JZ相等则转移或为零则转移ZF
      JNE/JNZ不相等则转移或不为零则转移ZF
      JG/JNLE大于则转移或不小于等于则转移OF,SF,ZF
      JGE/JNL大于等于则转移或不小于则转移OF,SF
      JL/JNGE小于则转移或不大于等于则转移OF,SF
      JLE/JNG小于等于则转移或不大于则转移OF,SF,ZF
  • 以下条件转移指令含有专门用途

    • 符号说明测试的标志
      JCXZ若CX为零则转移
      JC进位为1则转移(和JB相同)CF
      JNC进位为0则转移CF
      JO溢出则转移OF
      JNO不溢出则转移OF
      JP/JPE奇偶位为1则转移或奇偶性为偶则转移PF
      JNP/JPO奇偶位为0则转移或奇偶性为奇则转移PF
      JS符号位为1(负)则转移SF
      JNS符号位为0(正)则转移SF
  • cmp cx, 100
    ;比较指令,执行减法操作,目的操作数-源操作数(2-100)
    jle @f
    
  • (-128~127)
    有符号数
    (0~255)
    无符号数
    20000 001022
    100- 0110 0100100100
    1001 1110-98(-98)158(-98)
    OF = 0CF = 1
  • SF:

    • 被减数 < 减数 SF = 1 ----> CX = 0 ~ 99
      • 被减数-减数,结果为负,故为1
    • 被减数 ≥ 减数 SF = 0 ----> CX = 100
      • 被减数-减数,结果为正,故为0
  • OF:

    • CX = 0~100 ----> OF = 0
  • ZF:

    • CX = 100 ----> ZF = 1
  • JLE的跳转条件:只有在被减数小于等于100时才会进行跳转

    • SF ≠ OF CX = 0 ~99 被减数 < 减数
    • ZF = 1 CX = 100 被减数 = 减数

第四节 数据结构–栈

  • 栈段寄存器SS

    • 偏移地址被指定为栈指针寄存器SP
  • 通过数据段寄存器DS和附加段寄存器ES访问内存单元的方式:

    • 手动为其配备偏移地址

    • mov al, [si]
      mov [es: di], al
      
  • 通过代码段寄存器CS访问内存单元的方式:

    • 偏移地址被指定为指令指针寄存器IP

    • 处理器会自动的根据CS和IP的值去访问它们所指向的内存单元,所以不存在一个显示的访问方式

    • mov [cs: di], al
      ;此行代码的作用和使用DS、ES寄存器相同
      ;既可以用于处理器自动访问内存单元,也可以用于操作者访问内存单元
      
  • 通过SS寄存器,访问内存单元的方式

    • 偏移地址被指定为堆栈寄存器SP
    • push指令,用于写入数据(压栈)
    • pop指令,用于读取数据(出栈)

- [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nybcda2X-1578195809797)(E:\workspace\TyporaProjects\C笔记\汇编\images\第六章 栈和寻址方式\栈.png)]

  • PUSH AX (写入数据)

  • push指令先减2再存入数据

      1. SP - 操作数的数据宽度

      PUSH指令最低可以接收的数据宽度是16位(2个字节)

      8086处理器 —> push指令的操作数必须是16位(2个字节)的

      PUSH AL —> 错误

      8086处理器 —> SP -2

      1. 将操作数存入SS:SP所指向的内存单元中
    • push指令存入的数据所占用的内存称为栈段

      • 栈的推进方向为向下推进,与程序的执行方向相反
      • 后进先出(抽象为倒放的容器进行理解,先存入的数据会被放在倒放的容器的最顶端,故最后被取出)
  • POP DX (读取数据)

  • pop指令是push指令的逆运算,先取出数据再加2

      1. SS:SP所指向的内存单元开始,取出2个字节(16位)的数据到DX寄存器中
      2. 8086处理器 —> SP + 2

第五节 分解各个数位并压栈

	xor cx, cx
	mov ss, cx
	mov sp, cx
	;将栈段寄存器、栈指针寄存器初始化为0

	mov bx, 10

@d:
	inc cx
	;记录压栈的次数
	xor dx, dx
	div bx
	add dx, 0x30
	;余数+0x30,得到个位数值的ASCII码
	push dx
	;将各位数值的ASCII码进行压栈,存入栈段中
	cmp ax, 0
	;将ax寄存器中的进行判断,若AX寄存器中的值=0,则跳出循环,向下执行
	jne @d
	;cmp和jne指令事先不知道循环次数,需对条件进行判断,来决定是否进行循环
	;loop指令则是事先明确知道循环次数,根据循环次数决定是否进行循环

第六节 出栈并表示各个数位

@a:
	pop dx
	;读取最高位数值的ASCII码,进入循环中以此类推
	mov [es:di], dl
	inc di
	mov byte [es:di], 0x07     ;显示字符的颜色属性
	inc di
	loop @a
	;循环次数由CX值(压栈次数)决定,
	
	jmp near $
	;无限循环
	times 510 - ($ - $$) db 0
	;填补字节数
	db 0x55, 0xaa
	;硬盘第511、512位置处的有效标志

第七节 8086处理器的寻址方式

在这里插入图片描述

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值