zoukankan      html  css  js  c++  java
  • 汇编05:[BX]和loop指令

    [BX]和loop指令

    [bx]

    下列命令可以用寄存器代表偏移地址:

    mov al,[bx]				将内存中的数据传入al寄存器中,该地址的偏移地址为bx寄存器的值,段地址在ds中
    mov [bx],al				将al寄存器中的值放入地址中,该地址的偏移地址为bx寄存器的值,段地址在ds中
    

    之所以要采用这种方式,而不是直接将偏移地址写在括号中,是因为下列指令编译器是无法成功解释的:

    mov al,[0]
    

    上面这条语句会被编译器理解为:

    mov al, 0
    

    这种将常量放在括号中的方式只有在debug模式下输入才能成功解释。为了让编译器成功执行赋值操作,需要借助bx寄存器,先将偏移地址放入bx中,然后再使用下列语句:

    mov al,[bx]
    

    或者也可以在编译器中显式的指明段地址:

    mov al,ds:[0]			将段地址为ds中的数值,偏移地址为0的数据赋值给al寄存器
    

    这就是段前缀。

    loop指令

    编写一个程序计算2的平方:

    assume cs:code
    code segment
    	mov ax,2
    	add ax,ax
    	
    	mov ax,4c00h
    	int 21h
    code ends
    end
    

    如果要计算2的11次方,用add指令来做是非常麻烦的,可以用loop指令来完成:

    assume cs:code
    code segment
    	mov ax,2
    	mov cx,11
    s:  add ax,ax
    	loop s
    	mov ax,4c00h
    	int 21h
    code ends
    end
    

    在执行loop s指令时,首先把cx寄存器中的值自减1,然后判断cx中的值,如果不为0就跳转到s所标识的地址处执行,根据cx和loop配合来完成循环功能。在编程的时候注意,cx中的值就是循环次数,loop标识的地址要放在loop指令的前面。

  • 相关阅读:
    云原生技术实践,起步k8s
    线程,同步构造
    线程,限制的异步操作
    DotNet Core管道通信
    打下设计模式
    739--Daily Temperatures
    1021--RemoveOutermostParentheses
    Java并行程序基础。
    155--MinStack
    1047--Remove All Adjacent Duplicates In String
  • 原文地址:https://www.cnblogs.com/yinyunmoyi/p/12811463.html
Copyright © 2011-2022 走看看