汇编实验(3.1)
实验内容
内存source中存放着一个以0为结束标识的字符串,找出其中的大写字母和小写字母,统计他们的个数,结果放到num1和num2中,并显示出来。
统计功能
DATAS SEGMENT
;此处输入数据段代码
source db 'SSSSaaa234235',0
;source 为需要统计的代码段
num1 db 0;保存大写字母的数量
num2 db 0 ;保存小写字母的数量
DATAS ENDS
STACKS SEGMENT
;此处输入堆栈段代码
STACKS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
MOV AX,DATAS
MOV DS,AX
;此处输入代码段代码
mov ax,offset source
mov si,ax
MOV AX,0;初始化ax,al统计大写字母,ah统计小写字母
count:mov bl,[si]
cmp bl,0
je L3 ;遇到ascii为0的跳出循环
cmp bl,'A'
jb L1 ;小于‘A'则直接进入下次循环
cmp BL,'Z'
JBE L2;为大写字母
CMP BL,'a'
JB L1;不为大写字母,也不为小写字母ascii A<a
CMP BL,'z'
JA L1;大于z,不为小写字母
INC AH
JMP L1
L2 :INC AL
L1 :inc si;si往后移一位
jmp count
L3: int 3
MOV AH,4CH
INT 21H
CODES ENDS
END START
有符号十进制数显示程序
算法步骤:
1)先判断数据是零、正数或负数,是零显示“0”退出
2)是负数,显示负号“-”,求数据的绝对值
3)接着数据除以10,余数为十进制数码,加30H转换为ASCII码保存
4)重复第(3)步,直到商为0结束
5)依次从高位开始显示各位数字
DATAS SEGMENT
;此处输入数据段代码
array dw 6789,-1234,0,1
DATAS ENDS
STACKS SEGMENT
;此处输入堆栈段代码
STACKS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
MOV AX,DATAS
MOV DS,AX
;此处输入代码段代码
mov cx,lengthof array
xor bx,bx
again:mov ax,array[bx];
call dispsiw;调用子程序显示一个数据
add bx,type array
call dispcrlf;换行以便显示下一个数据
loop again
jmp ex
dispsiw proc near
push ax
push bx
push dx
test ax,ax;判断是零、正数或负数
jnz dsiw1;不是零,跳转
mov dl,'0'
mov ah,2
int 21h
jmp dsiw5;转向显示
dsiw1:jns dsiw2;是正数,跳转
mov bx,ax
mov dl,'-';是负数,显示负号
mov ah,2
int 21h
mov ax,bx
neg ax;数据求补(绝对值)
dsiw2:mov bx,10
push bx;10压入堆栈,作为退出标志
dsiw3:cmp ax,0 ;数据(商)为零,转向保存
jz dsiw4
xor dx,dx ;扩展被除数为DX.AX
div bx ;数据除以10:DX.AX÷10
add dl,30h ;余数(0~9)转换为ASCII
push dx ;数据先低位后高位压入堆栈
jmp dsiw3
dsiw4:pop dx
cmp dl,10
je dsiw5
mov ah,2;
int 21h
jmp dsiw4
dsiw5:pop dx
pop bx
pop ax
ret
dispsiw endp
dispcrlf proc near
push ax
push dx
mov dl,0dh ;输出回车字符
mov ah,2
int 21h
mov dl, 0ah ;输出换行字符
int 21h
pop dx
pop ax
ret
dispcrlf endp
ex: mov ah,4ch
int 21h
CODES ENDS
END START
综合
DATAS SEGMENT
;此处输入数据段代码
source db 'SSSSaaa234235',0
;source 为需要统计的代码段
num1 db 0;保存大写字母的数量
num2 db 0 ;保存小写字母的数量
output1 db 'num1: $'
output2 db 'num2: $'
DATAS ENDS
STACKS SEGMENT
;此处输入堆栈段代码
STACKS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
MOV AX,DATAS
MOV DS,AX
;此处输入代码段代码
mov ax,offset source
mov si,ax
mov AX,0;初始化ax,al统计大写字母,ah统计小写字母
count:mov bl,[si]
cmp bl,0
je L3 ;遇到ascii为0的跳出循环
cmp bl,'A'
jb L1 ;小于‘A'则直接进入下次循环
cmp BL,'Z'
JBE L2;为大写字母
CMP BL,'a'
JB L1;不为大写字母,也不为小写字母ascii A<a
CMP BL,'z'
JA L1;大于z,不为小写字母
INC AH
JMP L1
L2 :INC AL
L1 :inc si;si往后移一位
jmp count
mov num1,al
mov num2,ah ;保存数据
L3: int 3; debug 断点测试
mov bx,ax
mov dx,offset output1
mov ah,9
int 21h
mov al,bl
mov ah,0
call dispsiw
call dispcrlf
mov dx,offset output2
mov ah, 9
int 21h
mov ah,bh
mov al,0
xchg ah,al
call dispsiw
call dispcrlf
jmp ex
dispsiw proc near
push ax
push bx
push dx
test ax,ax;判断是零、正数或负数
jnz dsiw1;不是零,跳转
mov dl,'0'
mov ah,2
int 21h
jmp dsiw5;转向显示
dsiw1:jns dsiw2;是正数,跳转
mov bx,ax
mov dl,'-';是负数,显示负号
mov ah,2
int 21h
mov ax,bx
neg ax;数据求补(绝对值)
dsiw2:mov bx,10
push bx;10压入堆栈,作为退出标志
dsiw3:cmp ax,0 ;数据(商)为零,转向保存
jz dsiw4
xor dx,dx ;扩展被除数为DX.AX
div bx ;数据除以10:DX.AX÷10
add dl,30h ;余数(0~9)转换为ASCII
push dx ;数据先低位后高位压入堆栈
jmp dsiw3
dsiw4:pop dx
cmp dl,10
je dsiw5
mov ah,2;
int 21h
jmp dsiw4
dsiw5:pop dx
pop bx
pop ax
ret
dispsiw endp
dispcrlf proc near
push ax
push dx
mov dl,0dh ;输出回车字符
mov ah,2
int 21h
mov dl, 0ah ;输出换行字符
int 21h
pop dx
pop ax
ret
dispcrlf endp
ex: MOV AH,4CH
INT 21H
CODES ENDS
END START
过程
环境:ml 位于d:\app\ml615
实验文件命名为2.asm 位于d:\app\ml615下
下载:汇编工具、dos及案例代码.zip
步骤:
1) 编写汇编代码
2)cltr+r 打开cmd 切换目录
3) 打开dosbox 切换目录 运行2.exe文件