四、实验内容与步骤
1、实验内容
(1)单步运行调试上面程序sy07_1.ASM, 给程序的语句加上注释;
(2)编写程序,计算数组ARRAY中各数的和(参看书上P364例10-1)。程序保存为sy07_2.ASM;
(3)编写程序,统计字符串STRING中大写字母的个数(参看书上P366例10-2)。程序保存为sy07_3.ASM;
sy07_1.ASM
stack segment para stack
dw 20H dup(0)
stack ends
data segment
vary db 23h,78h,56h,0abh,00h,0cdh,59h,14h,98h,0efh,00h,0c0h
cnt equ $-vary
vm db ?
vn db ?
vk db ?
data ends
code segment
assume cs:code,ds:data,ss:stack
start:
mov ax,data
mov ds,ax
mov bx,0 ;初始化
mov dl,0 ;清零
lea si,vary ;初始化地址指针
mov cx,cnt ;设置循环次数
;循环体
lop1:
cmp byte ptr[si],0 ;和0比较
je zero ;等于0转ZERO
js lop2 ;为负数转LOP2
inc bh ;统计正数个数的寄存器增1
jmp next
lop2:
inc bl ;统计负数的寄存器增1
jmp next
zero:
inc dl ;统计0个数的寄存器增1
next:
inc si ;修改地址指针
loop lop1 ;判断终止条件,CX!=0则循环
;结束处理部分
mov vm,bh ;保存正数的个数
mov vn,bl ;保存负数的个数
mov vk,dl ;保存0的个数
mov ah,4ch
int 21h ;返回DOS
code ends
end start
sy07_2.ASM
DATA SEGMENT
ARRAY DB 1,2,3,4,5,6,7,8,9,10
COUNT EQU $-ARRAY
SUM DW ?
DATA ENDS
STACK1 SEGMENT PARA STACK
DW 20H DUP(0)
STACK1 ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START:
MOV AX,DATA
MOV DS,AX
XOR AX,AX ;AX寄存器清0,累加用
MOV CX,0 ;计数器CX清0
MOV SI,0 ;数组指针清0
NEXT:
ADD AL,ARRAY[SI] ;数组累加
INC SI ;数组指针后移
INC CX ;计数器加1
CMP CX,COUNT ;计数器值与循环次数比较
JL NEXT ;如果小于,继续循环
MOV BYTE PTR SUM,AL ;将累计和存入变量
MOV AH,4CH
INT 21H
CODE ENDS
END START
sy07_3.ASM
DATA SEGMENT
STRING DB 'The CPU is the brains of the computer'
COUNT EQU $-STRING
SUM DW ?
DATA ENDS
STACK1 SEGMENT PARA STACK
DW 20H DUP(0)
STACK1 ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START:
MOV AX,DATA
MOV DS,AX
XOR AX,AX
MOV CX,COUNT ;将循环次数数存入CX
MOV SI,0 ;字符串指针清0
AGAIN:
MOV BL,STRING[SI] ;取字符串中的字符
CMP BL,'A' ;比较字符与A的ASCII码
JB NEXT ;如果小于,跳转
CMP BL,'Z' ;比较字符与Z的ASCII码
JA NEXT ;如果大于,跳转
INC AX ;是大写字母,个数加1
NEXT:
INC SI ;指向下一个字符
LOOP AGAIN ;如果小于循环次数,继续循环
MOV SUM,AX
MOV AH,4CH
INT 21H
CODE ENDS
END START