访客地图

汇编第五章

张成
2014/12

汇编语言第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字节