美文网首页程序员
[bx] 和 loop 指令

[bx] 和 loop 指令

作者: openoter | 来源:发表于2017-09-15 11:05 被阅读42次

[bx]

assume cs:code
code segment
start:  mov ax, 2000H
        mov ds, ax
        mov al, [0]
        mov bl, [1]
        mov cl, [2]
        mov dl, [3]
        
        mov ax, 4c00H
        int 21H
code ends
end start

[bx]是什么?

[bx] 它表示一个内存单元,跟 [0] 一样,它的偏移地址在[bx]中

[bx] 与 [0] 的区别:

mov ax, [0]:在编译器中运行时,会当做 mov ax,0来执行,而使用 mov ax, [bx]​​会获取偏移地址为0出的内存单元的数据
​mov ax, [bx]

描述性符号:“()”,具体应用如下:

()只是为了描述所用,在真实开发中不能这样使用。

  • ax中的内容为 0010H,我们可以这样描述:(ax)=0010H
  • 2000:1000出的内容为 0010H,我们可以着这样描述:(21000H)=0010H,括号中的地址即为物理地址(内容)
  • 对于 mov ax,[2],我们可以这样描述:(ax)=( (ds)*16+2)
  • 对于 mov [2]. ax,我们可以这样描述:( (ds)*16+2)=(ax)
  • add ax,2:(ax)=(ax)+2
  • add ax,bx:(ax)=(ax)+(bx)
  • push ax:
(sp)=(sp)-2  
​((ss)*16+(sp))=(ax)
  • pop ax
​((ss)*16+(sp))=(ax)
​(sp)=(sp)+2  
  • idata,表示常量

[bx]

mov ax, [bx]

功能:将bx中存放的数据作为一个偏移地址 EA·段内地址SA默认在ds中,将SA:EA处的数据送入ax中。

即 (ax) = (ds*16+(bx))

loop指令

计算 2^3。

; 使用loop计算 2^3

assume cs:code

code segment

start:  mov ax, 2
        
        ; 这里循环执行 2+2的操作,cx中存放循环的次数,s为标号,可自己指定
        mov cx, 3
     s: add ax,ax
        loop s
        ; 循环结束
        mov ax, 4c00H
        int 21H
code ends

end start

解析:

  • 上面的标号 s,表示的是一个地址,这个地址上有一条指令:add ax, ax
  • loop s执行步骤:
    • (cx)=(cx)-1
    • 判断cx中的值是否为0,如果为0则执行下一步(退出循环),否则执行循环中的指令即add ax,ax

基本框架

mov cx, 循环次数
s: 
    循环体
    loop s

案例

用加法计算 123*126, 结构存在ax中;

assume cs:code

code segment

start:  mov ax,0
        mov cx, 126
    s:  add ax,123
        loop s
        
        mov ax, 4c00H
        int 21H
code ends

end start

调试时,我们可以使用p命令跳出循环。

计算ffff:0006单元中的数乘以3,将结果存放在dx中。

; 计算ffff:0006单元中的数乘以3,将结果存放在dx中
assume cs:code

code segment

start:  mov ax, 0ffffH ; [0]为什么是 0ffffH
        mov ds, ax
        mov bx, 6,
        mov al, [bx]
        mov ah, 0 ;[1]以上两句可以改成 mov ax, [bx]吗?
        mov dx, 0
        
        mov cx,3
        
    s:  add dx, ax
        loop s
        
        mov ax, 4c00H
        int 21H
code ends

end start

解析:

  • [0]:大于9FFFF的十六进制的数有很多,如A0000H....,在汇编语言中不能以字母开头,所以在前面加上0
  • [1]:可以,能够通过编译

相关文章

  • [bx] 和 loop 指令

    [bx] [bx]是什么? [bx] 它表示一个内存单元,跟 [0] 一样,它的偏移地址在[bx]中 [bx] 与...

  • 《汇编语言》指令

    指令理解 loop:循环指令,需要在cx中记录循环计数器inc:+1指令, inc bx(将bx中的值+1)jcx...

  • 关于逆向的一点儿小知识(二)

    内存寻址方式 mov ax,[bx] ax=[ds*10H+bx] loop 循环指令,循环次数由计数寄存器CX...

  • 第 5 章 [BX]和loop指令

    1. [bx]和内存单元的描述

  • 汇编语言:七、[BX]和loop指令

    [bx] [bx]表示一个内存单元,它的偏移地址在bx中 () (ax)表示寄存器ax中的内容 inc ax ax...

  • 汇编五

    Loop指令 loop指令和cx寄存器配合使用,用于循环操作类似高级语言的for,while使用格式 loop指令...

  • 汇编(七)

    Loop指令 loop指令和cx寄存器配合使用,用于循环操作类似高级语言的for,while 使用格式 loop指...

  • 汇编(七)

    Loop指令 loop指令和cx寄存器配合使用,用于循环操作类似高级语言的for,while 使用格式 loop指...

  • iOS之底层汇编(七)

    Loop指令 loop指令和cx寄存器配合使用,用于循环操作类似高级语言的for、while 使用格式 loop指...

  • 【汇编语言】第 5 章 [BX] 和 loop 指令

    版权声明:本文为 gfson 原创文章,转载请注明出处。注:作者水平有限,文中如有不恰当之处,请予以指正,万分感谢...

网友评论

    本文标题: [bx] 和 loop 指令

    本文链接:https://www.haomeiwen.com/subject/mcdssxtx.html