1.指令
【3-39】以MEM为首地址的内存区域中有10个以非压缩的BCD码形式存放的十进制数,他们的值可能是0~9中的任意一个,现编程序将这10个数顺序显示在屏幕上:
程序代码如下:
LEA SI , MEM ;将MEM的16位偏移地址送到SI(源串偏移地址)
MOV CX , 10 ;设置串长度 10
CLD ; DF清零,使地址指针按增量的方向修改
MOV AH , 02H ;将02H放入寄存器AH,功能号(表示单字符显示输出)
NEXT: LODSB ;取一个BCD码到AL里面
ADD AL, 30H ;将BCD码转换为对应的ASCII码,0的ASCII为30H,所以需要加03H
MOV DL, AL ;将AL里面存的ASCII送到DL
INT 21H ;输出显示
DEC CX ; CX自减1
JNZ NEXT ;若ZF=0则重复
HLT 暂停程序
【3-40】把6000H:1200H单元开始的100个字存储单元的内容清零,可以用串存储指令实现。程序如下:
MOV AX , 6000H ;将6000H传送到AX中
MOV ES , AX ;将AX中的传到附加段ES作为目标串的段地址
MOV DI, 1200H ;DI目标串的偏移地址
MOV CX , 100 ;CX串长度为100
CLD ;DF=0,使地址指针按增量的方向修改
MOV AX , 0 ;将0存入到AX中
REP STOSW ;无条件重复,将AX的内容存放到DI中,直到CX=0,存完为止,这样就实现了清零
HLT ;暂停程序
【3-41】
…
MOV AX , BX ;将BX的内容送到AX
JMP NEXT ;无条件段内转移,直接转向目标地址NEXT处
ADD CL ,0FH ;不执行将CL的数据与0FH相加后放在CL里面
NEXT: OR CL , 7FH ;无条件转移后,直接执行NEXT后面的语句,将CL与7FH进行或运算后,结果放在CL里面
【3-42】
JMP DWORD PTR[BX]
段间间接转移:将BX作为偏移地址,DS段作为基址地址的物理内存单元的连续四个内存单元的内容送入IP和CS中(低字节内容送入IP,高字节内容送入CS),程序转移到另一个代码段继续执行。
【3-43】在内存的数据段中存放了100个8位带符号数,其首地址位TABLE,试统计其中正元素、负元素和零元素的个数,并分别将个数存入PLUS、MINUS和ZERO这3个单元中。
程序如下:
START:XOR AL , AL ;异或运算将AL清零
MOV PLUS ,AL ;将PLUS单元清零
MOV MINUS ,AL ;将MINUS单元清零
MOV ZERO ,AL ;将ZERO单元清零
LEA SI , TABLE ;取TABLE得偏移指令放入SI
MOV CL , 100 ;表长度送入计数寄存器CL
CLD ; DF清零,使地址指针按增量的方向修改
CHECK: LODSB ;取一个数到AL
OR AL , AL ;将AL中的操作数自身相或,影响标志位
JS X1 ;若为负即:符号标志位SF=1,转X1
JZ X2 ;若为零即:零标志位ZF=1,转X2
INC PLUS ;否则为正,PLUS自加1
JMP NEXT ;无条件转移到NEXT
X1: INC MINUS ;MIUS单元加1
JMP NEXT ; 无条件转移到NEXT
X2: INC ZERO ;ZERO单元加1
NEXT: DEC CL ;CL自减1
JNZ CHECK ;如果不等于零,转到CHECK
HLT 停止
【3-44】在以DATA为首地址的内存数据段中存放有200个16位带符号数,试事找出其中的最大数和最小数的符号数,并分别放在以MAX和MIN为首的内存单元中。
程序如下:
START: LEA SI, DATA ;将DATA的偏移地址送入SI,SI数据段首地址
MOV CX, 200 ;CX数据段长度
CLD ;DF=0,使向地址指针增加的方向修改
LODSW ;取AX一个16位带符号数
MOV MAX, AX ;将该数送MAX
MOV MIN , AX ;将该数送MIN
DEC CX ;CX自减1
NEXT: LODSW ;取下一个16位带符号数
CMP AX,MAX ;与MAX单元内容进行比较
JG LARGER ;若大于则转LARGER
CMP AX,MIN ;否则再与MIN单元内容进行比较
JL SMALL ;若小于MIN的内容则转SMALL
JMP GOON ;否则就转至GOON
LAFGER: MOV MAX ,AX ;MAX- AX
JMP GOON ; 否则就转至GOON
SMALL: MOV MIN ,AX ;MIN–AX
GOON: LOOP NEXT ;CX- 1,若CX!=0则转NEXT
HLT 停止
【3-45】比较两组输人端口的数据是否一致。主端口的首地址为MAIN_P0RT.冗余端口的首地址为REDUNDANT_PORT端口数目均为NUMBER.
程序如下:
MOV DX ,MAIN_PORT ;DX-主端口地址指针
MOV BX ,REDUNDANT_PORT ;BX冗余端口地址指针
MOV CX,NUMBER ;CX-端口数
TOP: IN AX , DX ;从主端口输入一个数据
XCHG AX , BP ;交换两个数据,将输入的数据暂存于BP
INC DX ;DX指针加1
XCHG BX , DX ;交换BX与DX的内容,冗余端口地址指针
IN AX , DX ;从冗余端口输入一个数据
INC DX ;冗余端口地址指针加1
XCHG BX , DX ;原寄存器地址指针
CMP AX , BP ;比较两端口数据
LOOPE TOP ;若两端口数据相等且CX-1!=0,则转向TOP
JNZ PORT_ERROR ;若两端口数据不相等,则转至PORT_ERROR
…
PORT_ERROR: ….
…