汇编第三次实验

原创
2018/04/19 13:13
阅读数 89

1 .  子程序设计
完成练习中 6.9 题。
设有 10 个学生的成绩分别是 76,69,84,90,73,88,99,63,100 和 80 分。试编制一
个子程序统计 60~69 分,70~79 分,80~89 分,90~99 分和 100 分的人数并分别
存放到 S6, S7, S8, S9 和 S10 单元中。

DSEG SEGMENT
GRADE DB 76,69,84,90,73,88,99,63,100,80,100      ;分数存放在GRADE存储单元
len dw $-GRADE
SX DB 5 DUP(0)                               ;sx是分数段临时累加单元
S1 DB 0                                      ;S1存放60~69分数段人数
S2 DB 0                                      ;S2存放70~79分数段人数
S3 DB 0                                      ;S3存放80~89分数段人数
S4 DB 0                                      ;S4存放90~99分数段人数
S5 DB 0                                      ;S5存放100分人数
NOTICE DB 'INPUT A NUMBER',0DH,0AH,'$'
DSEG ENDS
CSEG SEGMENT
ASSUME DS:DSEG,CS:CSEG                      ;数据段和代码段初始化
STA:MOV AX,DSEG
    MOV DS,AX
    MOV DI,OFFSET GRADE                     ;DI指向所取分数单元地址                        
    MOV CX,len
    LEA SI,SX                               ;SI用于操作临时累加单元
AGIN:MOV AL,[DI]
    XOR BX,BX
    CALL COMP
    ;MOV AH,02H                                    
    ;MOV DL,BL
    ;ADD DL,30H
   ; INT 21H     ;在屏幕显示所要操作临时单元的那个分数段,用BL的内容表示
    INC BYTE PTR[SI+BX]    ;被分数所在分数段对应的单元加1
    INC DI
    LOOP AGIN
    XOR BX,BX              ;将临时累加单元的分数段统计内容
    MOV AL,[SX+BX]
    MOV S1,AL
    INC BX
    MOV AL,[SX+BX]
    MOV S2,AL
    INC BX
    MOV AL,[SX+BX]
    MOV S3,AL
    INC BX
    MOV AL,[SX+BX]
    MOV S4,AL
    INC BX
    MOV AL,[SX+BX]
    MOV S5,AL               ;分别存入S1,S2,S3,S4,S5
   ; MOV AH,02H
   ; MOV DL,0AH
   ; INT 21H
   ; MOV AH,09H
   ; LEA DX,NOTICE
  ;  INT 21H
   ; MOV AH,08H             ;输入欲显示统计人数的分数段的单元号,1~5之间
    ;INT 21H
   ; SUB AL,30H                          
  ;  XOR BX,BX
   ; MOV BL,AL
   ; MOV AH,02H
  ;  MOV DL,[SX+BX-1]
  ;  ADD DL,30H
  ;  INT 21H                ;根据输入单元号,显示对应分数段人数
    MOV AH,4CH
    INT 21H
;入口条件,AL,BX;AL存放被比较分数,BX返回分数段值
;子程序,用于比较出在哪个分数段,并把所在段值给BX
COMP  PROC
    CMP AL,69
    JA C1
    JMP EXI
    C1:CMP AL,79
    JA C2
    INC BX
    JMP EXI
    C2:CMP AL,89
    JA C3
    ADD BX,2
    JMP EXI
 C3:CMP AL,99
    JA C4
    ADD BX,3
    JMP EXI
 C4:ADD BX,4
  EXI:RET
    COMP ENDP
CSEG ENDS
    END STA

 


2 2 .  递归 子 程序设计
完成练习中 6.13 题。
给定一个正数 N≥1 存放在 NUM 单元中,试编制一递归子程序计算 FIB(N),并
将结果存入 RESULT 单元中。
Fibonacci 数的定义如下:
FIB(1)= 1
FIB(2)= 1
FIB(n)= FIB(n-2)FIB(n-1) n>2

DATAS SEGMENT
    ;此处输入数据段代码  
    len equ 10
    arr db len dup(0)
DATAS ENDS

STACKS SEGMENT
    ;此处输入堆栈段代码
STACKS ENDS

CODES SEGMENT
    ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
    MOV AX,DATAS
    MOV DS,AX
    ;此处输入代码段代码
    
    ; 初始化,由第二项开始计算
    mov arr[0],1
    mov arr[1],1
    	
    mov dx,2
    
 	call fib
    
    
    MOV AH,4CH
    INT 21H
    
fib proc 
	cmp dx,len
	jz stop
	sub ah,ah
	mov si,dx
	sub si,1
	mov bh,arr[si]
 	add ah,bh
 	sub si,1
	mov bh,arr[si]
 	add ah,bh
 	mov si,dx
 	mov arr[si],ah
 	
	add dx,1
	call fib
stop:
	ret

fib endp 
CODES ENDS
    END START

 


3 3 .  高级汇编语言技术
完成练习中 7.11 题。
试编写一段程序,完成以下功能:若给定名为 X 的字符串长度大于 5 时,下列指
令将汇编 10 次。
ADD AX, AX
(要求:使用条件汇编,编译过程中生成 LST 文件,查看宏展开情况)

DATAS SEGMENT
    ;此处输入数据段代码  
    string db '1234567'
    len equ $-string   ;计算字符串长度
DATAS ENDS

STACKS SEGMENT
    ;此处输入堆栈段代码
STACKS ENDS

CODES SEGMENT
    ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
    MOV AX,DATAS
    MOV DS,AX
    ;此处输入代码段代码
    
    mov ax,1
    
    IF len GT 5
    REPT 10
    ADD ax,ax
    ENDM
    ENDIF
    
    MOV AH,4CH
    INT 21H
CODES ENDS
    END START

结果为2^10 D=400H

 

 

展开阅读全文
打赏
1
0 收藏
分享
加载中
更多评论
打赏
0 评论
0 收藏
1
分享
返回顶部
顶部