title: 汇编第二次上机实验
date: 2021-06-06 19:50:04
PDF
下载地址:点击下载
汇编第二次上机实验
1、 循环程序设计
数据段中已定义了一个长度为n(n>=16)的字数组M,试编写一程序求出M中绝对值最大的数,把它放在数据段的M+2n单元中,并将该数的偏移地址存放在M+2(n+1)单元中,M是数组首地址。要求:
(1)把自己学号每2位一组,分别定义前5个字的初始值。例如,某同学的学号为2195012345,则数组M的前5个字的定义为:21H,95H, 01H, 23H, 45H, 剩余的字根据程序调试需要进行初始化。
2、 分支程序设计
设计一个程序,在数据段用自己的学号定义一个字符串,字符串长度大于20,对该字符串中字符0~9字符出现的次数进行计数,计数结果存放在以COUNT为首地址的数组中,并将出现次数最多的字符和出现次数显示出来。要求:
(1)该字符串的前10个字符必须为自己的学号,例如某同学的学号为2195012345,则该字符串的定义为 ‘2195012345xxxxxxxxxxxxxxxx’,字符串中的x根据程序调试需要进行初始化;
(2)如果字符9出现的次数为5次,且是出现次数最多的字符,则在程序结束时输出: 9,5。若有多个次数相同的字符,则输出字符最大的哪个。
1、 循环程序设计
datasg segment
M dw 0021h,0094h,0021h,0043h,0036h,0011h,0022h,0033h,0044h,0055h,0066h,0077h,0088h,0099h,0100h
ans dw ?
addr dw ?
;注意用逗号分隔
datasg ends
codesg segment
assume ds:datasg,cs:codesg
start:;要加start和end start 要不然数据段不正常
mov ax,datasg
mov ds,ax;将数据段地址送ds
sub ax,ax;将ax清零
mov cx,16;设置循环次数
mov ax,ds:[bx];以第一个数字为最大值
;注意ds后面的括号,使用寄存器间接寻址
;时只能用bx,bp,si,di,不能用ax
mov ans,ax
mov addr,bx
add bx,2
j :cmp ax,ds:[bx];与后一个数比较
jl c;小于则将后一个数置为最大
add bx,2;不小于则向后比较
loop j
jmp e;结束
c :mov ax,ds:[bx];更换最大数
mov ans,ax
mov addr,bx
dec cx;判断循环次数
cmp cx,0
je e;结束
add bx,2;向后比较
jmp j;回到比较环节
e :mov ax,4c00h
int 21h
codesg ends
end start
2、 分支程序设计
codesg segment
assume ds:datasg,cs:codesg
start:
mov ax,datasg
mov ds,ax
mov dx,0
mov si,0
lea di,COUNT
mov cx,28;设置循环次数
;计数模块
j1: mov bl,ds:[si]
mov bh,0
inc byte ptr ds:[bx+di-30h]
inc si
loop j1
;找出出现最多的字符
lea si,COUNT
mov bx,0
mov cx,9
sub ax,ax;将ax清零
mov al,ds:[bx+si];
mov ans,bl
mov time,al
inc bx
j2 :cmp al,ds:[bx+si];与后一个数比较
jl c;小于则将后一个数置为最大
je equal;相等判断
inc bx;不小于则向后比较
loop j2
jmp en;结束
c :mov al,ds:[bx+si];更换最大数
mov ans,bl
mov time,al
dec cx;判断循环次数
cmp cx,0
je en;结束
inc bx;向后比较
jmp j2;回到比较环节
equal:;相等情况
cmp bl,ans
jg c
inc bx
dec cx
cmp cx,0
je en
jmp j2
;输出!!!!!
en: add byte ptr ans,30h
add byte ptr time,30h;转ascii码
mov dx,offset ans;注意输出方式
mov ah,09h
int 21h
mov dx,offset time
mov ah,09h
int 21h
mov ax,4c00h
int 21h
codesg ends
end start
程序在DOSBox下直接运行的截图