汇编第五章
汇编语言第5章 [BX]和loop指令
[BX] 指代BX中存放的数据 作为此时的偏移地址
()用法 什么中的内容
(ax)
((ds)*16+(bx))
(20000H)
idata
mov ax,[idata] mov ax,[1]
inc bx 让bx的值+1
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
cx存放loop执行的次数
loop让CPU重复执行 cx中数值 次 s中的代码
执行过程 先将CX-1 若 =0 则往下执行 否则执行循环
在汇编程序中 数据不能以字母开头 ADDD 要写成 0ADDD
程序最后返回的命令
mov ax,4c00h
int 21h 要用p执行
g 0012 表示 直接执行到 偏移地址为0012的地方
执行到LOOP命令 时 可以使用p 命令 使得LOOP命令全部执行完毕
DEBUG和汇编编译器对指令的不同
DEBUG 针对
mov ax,[0] 就是把DS:0的数据搬到ax
汇编源程序如果这么写 那边编译之后 会执行的是 mov ax,0
必须改成 mov ax,ds:[0]
mov ax,[bx]
mov ax,ds:[bx]
loop与bx的联合应用
利用bx存储 下个数据的偏移地址
cx 中存放loop的次数
inc bx bx中的值+1
一段安全的空间
0:200 0:2ff 空间中 一般没什么使用 实验我们用这处地址
练习
向内存0:200-0:23f 依次传送0-63
1压栈方式
assumen cs:code
code segment
mov bx,20h
mov ss,bx
mov sp,40h
mov bx,3f3eh
mov cx,32
s: push bx
sub bx,202h
loop s
mov ax,4c00h
int 21h
code ends
end
0000:0200 00 ....0F
.
.
.
0000:0230 30 31 ... 3C 3D 3E 3F
0000:0240 00 00 ...
压栈方式 一次压入2个字节数据 找规律 3F3E - 3D3C = 202
2传统方式
assumen cs:code
code segment
mov ax,20h
mov ds,ax
mov bx,0
mov cx,64
s: mov [bx],bl
inc bx
loop s
mov ax,4c00h
int 21h
code ends
end
利用bx 可以2个地方用到 作为 数据段的偏移地址 以及数据本身
2 将mov ax,4c00h 之前的指令 复制程序 到内存0200h处
assume cs:code
code segment
mov ax,cs 代码段地址
mov ds,ax 数据段地址 《-代码段地址
mov ax,0200h 指定内存段地址
mov es,ax 数据段地址
mov bx,0 设置偏移地址
mov cx,17h 次数
s: mov al,[bx] 此时 数据段地址 指向 代码段地址 al 只是个中间转换处 因为1个内存单元占1个字节 所以只需要 al就行了 把 需要复制的代码 复制到al 中
mov es:[bx],al 把 al 放到指定的 内存单元中
inc bx
loop s
mov ax,4c00h
int 21h
code ends
end
代码操作:寄存器之间操作 占2字节 寄存器和直接数操作 占3字节