LOOP指令
1. 功能:实现循环(计数型循环)
2. 格式:LOOP + 标号
3. cpu执行LOOP语句时进行的操作:
- cx = cx-1
- 判断cx的值,如果不为零则转到标号处执行程序,如果为零则向下执行。
例如:
mov bx,2
mov cx,11
loop_start:
mov ax,bx # 循环体中的代码
add ax,ax # 例如,打印一些字符或执行一些计算
loop loop_start ; 使用LOOP指令,每次循环都将CX减1,如果CX不为0,则跳转到loop_start继续循环
图中循环将会执行11次,每一次循环AX寄存器里存的数会加2.
变址寄存器SI和DI
SI和DI是和BX功能相近的寄存器,可以用于存放地址信息。
SI寄存器:
SI(Source Index):源变址寄存器,用于存放源数据的地址(偏移地址)。在数据传送或字符串操作中,SI寄存器通常指向源数据的起始位置。
使用方法:
mov SI,0
mov ax,[SI]
或
mov SI,0
mov ax,[SI + 123]
DI寄存器:
DI(Destination Index):目标变址寄存器,用于存放目标数据的地址(偏移地址)。在数据传送或字符串操作中,DI寄存器通常指向目标数据的起始位置。
使用方法:
mov DI,0
mov ax,[DI]
或
mov DI,0
mov ax,[DI + 123]
例如,如果要将下面这段程序中的'welcome to masm!'复制到后面的数据区中,我们可以用DS:SI指向要复制的原始字符串,用DS:DI指向目的空间(后面的数据区),然后循环复制即可。
寻址方式
[bx + idata]寻址方式
[bx + idata]表示一个内存单元,他的偏移地址为bx+idata,代表的是DS:[bx+idata]
- mov ax,[bx + 200]的含义:将一个长度为2字节的内存单元送入ax,内存单元的段地址在DS中,偏移地址为bx里的值加上200。
- 其他写法:mov ax,[200 + bx]、mov ax,200[bx]、mov ax,[bx].200
[bx + SI]寻址方式
[bx + SI]表示一个内存单元,他的偏移地址为bx + SI,代表的是DS:[bx+SI]
- mov ax,[bx + SI]的含义:将一个长度为2字节的内存单元送入ax,内存单元的段地址在DS中,偏移地址为bx里的值加上SI的值,其中bx叫基址,SI叫变址。
- mov ax,[bx + SI]的数学化描述:(ax) = ((ds)*16 + bx + si)
- 其他写法:mov ax,[bx][SI]
[bx + SI + idata]寻址方式
[bx + SI + idata]表示一个内存单元,他的偏移地址为bx + SI + idata,代表的是DS:[bx+SI+idata]
- mov ax,[bx + SI + idata]的含义:将一个长度为2字节的内存单元送入ax,内存单元的段地址在DS中,偏移地址为bx里的值加上SI的值再加上idata的值。
- mov ax,[bx + SI + idata]的数学化描述:(ax) = ((ds)*16 + bx + si + idata)
- 其他写法:mov ax,200[bx][si]、mov ax,[bx].200[si]、mov ax,[bx][si].200
指针寄存器BP
BP用于内存寻址时功能和用法与bx相同,但是两者有有区别;
- bx是唯一可以用于内存寻址的通用寄存器,bx以外的通用寄存器、段寄存器都不可以用于[....]中。
- BP也用做基址
- 在没有指明的情况下,bx的段地址默认是DS段(数据段),BP的段地址默认是SS段(栈段)
div指令
存放:
div是除法指令,使用div做除法时:
- 被除数:被除数放在AX或AX和DX中,当被除数为8位或16位(字节和字)时,用AX存,如果是32位(双字),则用AX和DX存(DX存高位,AX存低位)。
- 除数:8位或16位,放在寄存器或内存单元中。
用法:
-
div 寄存器
-
div 内存单元
dup指令
DUP(Define Unary Operator for Plurality,用于定义单一操作符的复数形式)是一个操作符,用于在数据定义中重复指定的数据或数据模式。这可以非常方便地初始化大型数据结构,如数组或内存块。
功能:
dup和dd、dw、db等数据定义伪指令配合使用,用来进行数据的重复。