MOV DS, AX MOV CX, 4 MOV AL, MSG
MOV SI, OFFSET MSG+1 L1: CMP AL, [SI] JB NEXT MOV AL, [SI] NEXT: INC SI LOOP L1 MOV M, AL MOV AX, 4C00H INT 21H CSEG ENDS END START
6.修改后运行结果:
(5) 试编制一个汇编语言程序,求出首地址为DATA的10个无符号字数组中的最小偶数,把它存放在AX中。画出程序框图,写出源程序清单和执行结果。
word 0141H, 0AE00H, 07B4H, 0A508H, 0691H, word 0870H, 7542H, 0081H, 0916H, 0017H
a. 设计思路:本程序需要在10个无符号数中寻找最小的偶数,关键点为 最小和偶数,
所以需要两次判断,最后把结果放在AX中。 b. 程序设计图:
Data
c. 程序说明 dseg segment
data dw 0141H,0AE00H,07B4H,0A508H,0691H,0870H,7542H,0081H,0916H,0017H dseg ends cseg segment
assume ds:dseg,cs:cseg start: mov ax,dseg mov ds,ax
mov cx,9 //循环次数为9
mov ax,data //取data的首地址放在ax中 mov si,offset data+2 //取data的第二号地址放在si中 L1: test ax,01h // 判断ax中的数是奇数还是偶数 jnz L2 //不等于0即为奇数,跳到L2地址 test word ptr [si],01h //判断[si]中的数是奇数还是偶数 jnz next //奇数跳到next地址 cmp ax,[si] //比较ax与[si]
jb next //ax小于[si],跳到next地址 L2: mov ax,[si] //ax与[si]进行交换 next: add si,2 //si+2,取下个数地址 Loop L1 // L1进行循环 mov ax,4c00h // 退出 int 21h cseg ends end start d. 程序结果:
(6) 有10个数,统计正数的个数,存放在变量M中。经过汇编后,形成.EXE文件,先用G=0命令执行程序,用-D命令查看M单元的内容,会发现结果不正确。用单步执行命令T查找程序中的逻辑错误,注意每一次循环中AL寄存器中的值变化是否正确(AL寄存器中存放正数的个数)
DSEG SEGMENT
MSG DB 4, -2, -6, 0, 5, 67, 8, -3, 5, 6 M DB ? DSEG ENDS CSEG SEGMENT
ASSUME CS: CSEG, DS: DSEG START: MOV AX, DSEG MOV DS, AX
MOV CX, 10 MOV AL, 0 LEA SI, MSG
L1: MOV BL, [SI]
CMP BL, 0 JBE NEXT INC AL
NEXT: INC SI LOOP L1
MOV M, AL MOV AX, 4C00H INT 21H
CSEG ENDS END START a. 程序说说明
这个程序的目的是要在4, -2, -6, 0, 5, 67, 8, -3, 5, 6中找出正数的个数。 b. 调试说明:
运行无问题。
c. 错误问题:M单元中的内容错误,此时M为9,但真实值应为6.
d. 解决方法:该程序不应用无符号数的跳转,因此,需要把JBE改为JLE e. 修改后代码:
DSEG SEGMENT
MSG DB 4, -2, -6, 0, 5, 67, 8, -3, 5, 6 M DB ? DSEG ENDS
CSEG SEGMENT
ASSUME CS: CSEG, DS: DSEG START: MOV AX, DSEG MOV DS, AX MOV CX, 10 MOV AL, 0 LEA SI, MSG
L1: MOV BL, [SI] CMP BL, 0 JLE NEXT INC AL
NEXT: INC SI LOOP L1 MOV M, AL
MOV AX, 4C00H INT 21H CSEG ENDS END START f. 修改后结果:
(7) 假设有一组数据:5,-4,0,3,100,-51请编一程序,判断:每个数大于0,等于0,还是小于0;并将最终结果存于以result为存储的字节单元中,(Result DB 6 dup(?))
即:
y=
1 当x>0 0 当x=0
-1 当x<0 编程提示:
1.首先将原始数据装入起始地址为XX的字节存储单元中。
2.其中判断部分可采用CMP指令,得到一个分支结构,分别输出“y=0”, “y=1”,
“y=-1”。将结果存入result的相应单元
3.程序中存在一个循环结构,循环6次,调用6次分支结构后结束。
a.设计思路:该实验主要的两大步就是“与0比较”和“将结果存入result的相应单元”,因此,需要用指针来实现。
b.程序代码:
dseg segment
msg db 5, -4, 0, 3, 100, -51 result db 6 dup(?) dseg ends cseg segment
assume cs:cseg, ds:dseg start: mov ax,dseg mov ds,ax
mov cx,6 //循环6次
lea si,msg //取msg的首地址放在si中 lea di,result //取result的首地址放在result中 l1:mov bl,[si] //把si的内容放入bl中 cmp bl,0 //比较bl与0的大小