汇编实验(数据处理及直接定址表)

1. 字符串字典序比较

如下所示的数据区中给出两个字符串,请比较它们的大小,并将结果记录在result处:相等(E)、前大后小(A)、前小后大(B)

data segment
   str1 db 'Yan Tai',0
   str2 db 'Yan Tai',0
   result db 0
data ends

请在程序中加入足量的注释

assume cs:code, ds:data
data segment
      str1 db 'Yan Tai',0
      str2 db 'Yan Cheng',0
      result db 0
data ends
code segment
start:
      mov ax,data
      mov ds,ax
      mov si,offset str1    ;指向前一个字符串
      mov di,offset str2    ;指向后一个字符串
range:
      mov al,[si]     ;顺序取str1的字符
      mov ah,[di]     ;顺序取str2的字符
      cmp al,0
      je final
      cmp ah,0
      je final  ;以上4句判断两个字符串是否有一个到达末尾
      cmp al,ah ;两个字符串都没到末尾,比较大小
      je r      ;相等则继续比较
      jmp final
    r:
      inc si    ;指向str1的下一个字符
      inc di    ;指向str2的下一个字符
      jmp range
final:      ;最后一次判断
      je e
      ja a
      mov byte ptr [result],'B';前小后大
      jmp stop
    e:
      mov byte ptr [result],'E';相等,即都是末尾的0
      jmp stop
    a:
      mov byte ptr [result],'A';前大后小
stop:
      mov ax, 4c00h
      int 21h
code ends
end start

汇编实验-字符串字典序比较1

2. 最小字符

在数据区中给出10位评委为歌手的打分,最高分为10分,最低分为0分。
歌手的最终成绩为去掉一个最高分和一个最低分后的平均值(整数部分),请计算并将成绩记录在result处。

data segment
   singer db 8, 8, 8, 6, 10, 6, 6, 7, 7, 6
   result db 0
data ends

请在程序中加入足量的注释

assume cs:code, ds:data
data segment
      singer db 8,8,8,6,10,6,6,7,7,6
      result db 0
data ends
code segment
start:
      mov ax,data
      mov ds,ax
      mov cx,10
      mov si,offset singer
      mov ax,0          ;al总分
      mov bh,[si]       ;最高分
      mov bl,bh         ;最低分
range:
      mov ah,[si]       ;ah取数
      add al,ah         ;al加总分
      cmp ah,bh         ;比较
      jbe r
      mov bh,ah         ;更新最高分
    r:
      cmp ah,bl         ;比较
      jae rr
      mov bl,ah         ;更新最低分
   rr:
      inc si            ;指向下一个数
      loop range        ;继续循环
      mov ah,0          ;处理被除数
      sub al,bl         ;减去最底分
      sub al,bh         ;减去最高分
      mov dl,8
      div dl            ;求平均
      mov [result],al   ;保存整数商
      mov ax,4c00h
      int 21h
code ends
end start

3. 输出学生姓名

给出下的程序段,其中数据区存放了若干学生的姓名,请输入学生序号,在屏幕最上面一行输出对应学生的姓名。

assume cs:code, ds:data
data segment
      stu  dw stu1,stu2,stu3,stu4,stu5
      stu1 db 'Zhang San',0
      stu2 db 'Li Si',0
      stu3 db 'Wang Wu',0
      stu4 db 'Zhao Liu',0
      stu5 db 'Qian Er',0
data ends
code segment
start:
      mov ax, data
      mov ds, ax
      mov ax, 0b800h
      mov es, ax

input:
      mov ah,1
      int 21h     ;调用21h中断的第1号功能,从键盘读入字符,AL保存读入字符的ASCII码

      sub al, 30h ;相减后,al中保存的ASCII变为数字
      
      ;为0时退出,为1-5时在屏幕最上面一行输出对应人的姓名,输入其他无响应
      ;请在程序中加入足量的注释

      mov ah,4ch
      int 21h
code  ends
end start

Answer:

assume cs:code, ds:data
data segment
	stu  dw 0,stu1,stu2,stu3,stu4,stu5	;直接定址表
	stu1 db 'Zhang San',0
	stu2 db 'Li Si',0
	stu3 db 'Wang Wu',0
	stu4 db 'Zhao Liu',0
	stu5 db 'Qian Er',0
data ends
stack segment stack
	db 16 dup(0)
stack ends
code segment
start:
	mov ax,data
	mov ds,ax
	mov ax,0b800h	;显存区域从B800:0000开始,往后4000个字节,共25*80=2000个显示位
	mov es,ax		;每个位置占两个字节,有低字节ASCII码和高字节属性值

input:
	mov ah,01h	;DOS系统功能调用(21H类型中断调用)
	int 21h		;调用21h中断的第1号功能,单字符输入,功能号AH=01H,类型号21H
				;出口参数:AL=键入字符的ASCII码
	sub al,30h	;减字符'0',相减后,AL中保存的ASCII变为数字
				;为0时退出,为1-5时在屏幕最上面一行输出对应人的姓名,输入其他无响应
	call clear	;先把第一行清空
	cmp al,0
	je exit		;0退出
	cmp al,1	;不在1~5之间继续输入
	jb input
	cmp al,5
	ja input

	mov bh,0
	mov bl,al
	add bx,bx		;定址表为dw,乘2
	mov si,stu[bx]	;源字符串
	mov di,0		;目标字符串

c:	mov ch,0
	mov cl,ds:[si]
	jcxz input
	inc si
	mov ch,2h;字符属性值
	mov es:[di],cx
	add di,2
	loop c

clear:	;清空第一行
	mov cx,80	;第一行80个位置
	mov di,0	;第一行的偏移地址
	mov dx,0220h;背景色黑色,空格
	cle:
	mov es:[di],dx
	add di,2
	loop cle
	ret

exit:
	mov ah,4ch
	int 21h

code ends
end start

猜你喜欢

转载自blog.csdn.net/weixin_44169557/article/details/106852616
今日推荐