汇编语言-[bx]和loop指令和多个段

5.1 [BX]和内存单元的描述

要完成描述一个内存单元,需要两种信息:

  • 内存单元的地址:
    • 可以用 [0] 表示一个内存单元, 0 表示单元的偏移地址,段地址默认在 ds 中;
    • 同样也可以用 [bx] 表示一个内存单元,它的偏移地址在 bx 中;
  • 内存单元的长度(类型):
    • 将一个内存单元的内容送入 ax ,这个内存单元的长度就为 2 字节(字单元),存放一个字;
    • 将一个内存单元的内容送入 al,这个内存单元的长度就为 1 字节(字节单元),存放一个字节;

5.2 Loop 指令

loop 指令和 cx 相配合实现循环功能的,cx中存放循环的次数。
loop指令的格式是:loop 标号,CPU执行loop指令的时候,要进行两步操作

  • (cx)=(cx)- 1
  • 判断 cx 中的值,不为零则转至标号处执行程序,如果为零则向下执行。
    其框架为:
    mov cx, 循环次数
s:
    循环执行的程序段
    loop s

5.3 包含多个段的程序

在8086模式限制下如果数据,栈和代码需要的空间超过64KB,就不能放在一个段中,应该把数据,栈和代码放在对应的代码段栈段数据段
例如:

assume cs:code,ds:data,ss:stack
data segment
    dw 0001h,0002h,0003h,0004h,0005h,0006h,0007h,0008h  ;dw定义字形数据
data ends
stack segment
    db 0,0,0,0,0,0,0,0      ;定义字节型数据
stack ends
code segment
start: 
    mov ax,data     ;把数据段地址放入ax
    mov ds,ax
    mov ax,stack        ;把栈段地址放入ax
    mov ss,ax
    mov sp,18h  ;设置栈顶指向18h ,18h = 数据段8个字+栈段8个字节共24字节换成16进制。
    mov ax,4c00h
    int 21h
code ends
end start       ;end除了通知编译器程序结束外,还可以通知编译器程序的入口在什么地方。在这指明了程序的入口在标号 start 处。

猜你喜欢

转载自www.cnblogs.com/chengmf/p/12454670.html