汇编语言学习-[bx]和loop指令


总结

[bx]

mov ax,[bx], bx中存放的数据作为一个偏移地址EA,段地址SA默认在ds中,将SA:EA处的数据送入ax中,注意这里是字型数据哦! 即:ax = ds*16 + bx

建议以后再写汇编语言程序的时候,把[bx]前面的段寄存器显式地标注出来,也就是所谓的段前缀

loop指令

loop 指令就是一个循环指令,注意cx循环次数,和bx在循环过程中的变化。

综合应用

计算ffff:0-ffff:b单元中的数据的和,结果存储在dx中

数据相加的问题

  • dx = dx + 内存中的8位数据 类型不匹配
  • dl = dl + 内存中的8位数据 结果越界

解决方案:利用一个16位的寄存器来做中介。将内存单元中的8位数据赋值到一个16位寄存器ax中高八位要初始化为0,再将ax中的数据加到dx上,从而使两个运算对象的类型匹配并且结果不会超界。

实验

1 and 2

编程 ,向内存 0:2000:23F依次传送数据063

assume cs:codeseg

codeseg segment

start: mov ax,0200H    ;这里第一次写成0H了 心里想的确实是0200 不知道怎么弄成0了
      mov ds,ax
    
      mov bx,0H
      mov cx,40H
    
s:  mov ds:[bx],bl
    inc bx
    loop s
    
    mov ax,4c00H
    int 21h
codeseg ends
end start
end

3

将”mov ax,4c00h”之前的指令复制到内存0:200h处,补全程序,上机调试,跟踪运行结果.

assume cs:codeseg

codeseg segment

start: mov ax,cs
    mov ds,ax

    mov ax,0020h
    mov es,ax
    mov bx,0
    mov cx,17h;第一次写的21(10进制),看网上有说18的,感觉不对呀,我17的话就刚刚好是可以复制完的
    ;还有view里面cpu指令前面的地址是该指令的起始地址 你还要加上这个指令的大小,才算是下一条指令的相对地址,而且别忽略了最初的地址是从零开始算的

s:  mov al,ds:[bx];标签表示的是相对于段定义起始位置的位置
    mov es:[bx],al
    inc bx
    loop s

    mov ax,4c00h
    int 21h
codeseg ends
end start
end

运行结果


文章作者: 美食家李老叭
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 美食家李老叭 !
评论
  目录