[bx]的含义
- mov a1,[bx] 的意思:将一个内存单元的内容送入a1,这个内存单元的长度为2字节(字单元),存放一个字,偏移地址在bx中,段地址在ds中。
idata是什么意思
- 约定符号idata表示常量
- mov ax, [idata] == mov ax,[1]、mov ax,[2]、mov ax,[3]等
- mov ax, idata == mov ax,1、mov ax,2、mov ax,3等
loop指令
- loop指令的格式是:loop 标号,CPU执行loop指令的时候,要进行两步操作:
1、(cx) = (cx) - 1
2、判断cx中的值,不为0则转至标号处执行程序,如果为0则向下执行。
段前缀
- 例如mov ax,es:[bx]的含义是将一个内存单元的内容送入ax,这个内存单元的长度为2字节(字单元),存放一个字,偏移地址在bx中,段地址在es中。
- 这些出现在访问内存单元的指令中,用于显示地指明内存单元的段地址的"ds:" “cs:” “ss:” “es:”,在汇编语言中称为段前缀。
一段安全的空间
- 当我们需要直接向一段内存中写入内容时,这段内存空间不应该存放系统或其他程序的数据或代码,否则写入操作很可能引发错误。
CPU从何处开始执行程序?
- 归根结底,我们若要CPU从何处开始执行程序,只要在源程序中用"end标号"指明就可以了。
dw的含义
- dw–define word 定义数据。
- 开辟内存空间。
代码欣赏
- 实现功能:定义8个字单元数据,依次将这8个字单元的数据入栈,然后再依次出栈到这8个字单元中,从而实现数据的逆序存放。
assume cs:codesg !
codesg segment
dw 0123h,0456h,0789h,0abch,0fedh,0cbah,0987h
dw 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
start: mov ax,cs
mov ss,ax
mov sp,30h ! 将设置栈顶ss:sp指向cs:30
mov bx,0
mov cx,8
s: push cs:[bx]
add bx,2
loop s ! 以上将代码段0~15单元中的8个字型数据依次入栈
mov bx,0
mov cx,8
s0: pop cs:[bx]
add bx,2
loop s0 ! 以上依次出栈8个字型数据到代码段0~15单元中
mov ax,4c00h
int 21h
codesg ends
end start ! 指明程序的入口在start处
数据、代码、栈放入不同的段
assume cs:b,ds:a,ss:c
a segment
dw 0123h,0456h,0789h,0abch,0fedh,0cbah,0987h
a ends
c segment
dw 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
c ends
b segment
d: mov ax,c
mov ss,ax
mov sp,20h ;希望用c段当作栈空间,设置ss:sp指向c:20
mov ax,a
mov ds,ax ; 希望用ds:bx访问a段中的数据,ds指向a段
mov bx,0 ; ds:bx指向a段中的第一个单元
mov cx,8
s: push [bx]
add bx,2
loop s ; 以上将a段中的0~15单元中的8个字型数据依次入栈
mov bx,0
mov cx,8
s0: pop [bx]
add bx,2
loop s0 ; 以上依次出栈8个字型数据到a段的0~15单元中
mov ax,4c00h
int 21h
b ends
end d ; d处是要执行的第一条指令,即程序的入口