[BX]和内存单元的描述
- 描述一个内存单元,需要两种信息:
- 内存段元的地址
- 内存单元的长度(类型)
- [BX]同样也变是一个内存单元,他的偏移地址在bx中:
- mov ax,[bx]
- mov al,[bx]
-
描述性符号“()”
ax中的内容为0010H:(ax)=0010H;
- 2000:1000出的内容为0010H:(21000H)=0010H;
- mov ax,[2]:ax=((ds)*16+2);
- mov [2],ax:((ds)*16+2)=(ax);
- add ax,2:(ax)=(ax)+2;
- push ax:(sp)=(sp)-2 ((ss)*16+sp)=(ax)
pop ax:(ax)=((ss)*16+sp) (sp)=(sp)+2
Loop
指令格式:loop标号,CPU执行loop指令的时候:
- (cx)=(cx)-1;
- 判断cx中的值,不为零则转至标号处执行程序,如果为零则向下执行
2^12,结果放在ax;
assume cs:codesgcodesg segmenttong: mov ax,2mov cx,11s:add ax,axloop smov ax,4c00Hint 21Hcodesg endsend tong
ds:[bx]
- loop&cx
- degub -g&-p
mov ax,[0]:表示ds:0处的数据放入al中。但是在汇编元程序中,指令mov ax,[0]被编译器当做指令mov ax,0处理。
assume cs:codesgcodesg segmenttong:mov ax,1000Hmov ds,axmov ax,11mov [0],axmov ax,22mov [1],axxor ax,axmov ax,[0]xor ax,axmov ax,[1]mov ax,4c00Hint 21Hcodesg endsend tong
loop和[bx]的联合应用
计算ffff:0~ffff:b单元中的数据的和,结果存储在dx中。
- 数据单元是8位的,不能加到16为的寄存器中。
- 与dx结合,loop循环
类型的匹配和结果的不超界
assume cs:codesgcodesg segmenttong:mov ax,0ffffHmov ds,axmov cx,0bHxor dx,dxxor bx,bxs:mov al,[bx]mov ah,0add dx,axinc bxloop smov ax,4c00Hint 21Hcodesg endsend tong
将ffff:0~ffff:b的数值复制到0:200~0:20b中
可以将0:200~0:20b用0020:0~0020:b表示
assume cs:codesgcodesg segmenttong:mov cx,06Hmov bx,0hs:mov ax,0ffffhmov ds,axmov dx,[bx]mov ax,0020hmov ds,axmov [bx],dxadd bx,2loop smov ax,4c00Hint 21Hcodesg endsend tong
上面方法换数据段地址,效率不高。可以使用两个数据寄存器。
assume cs:codesgcodesg segmenttong:mov cx,0bhmov ax,0ffffhmov ds,axmov ax,0020hmov es,axxor bx,bxs: mov al,ds:[bx]mov es:[bx],alinc bxloop smov ax,4c00Hint 21Hcodesg endsend tong
就是秀~~~
