汇编小实验汇总——读写文件、冒泡排序、子程序设计……

汇编小实验汇总

读写文件

DATAS SEGMENT
    ;此处输入数据段代码
    ;直接调用dos的10号功能,前一个数字为长度
    buf1 db 100,?,100 dup(?);存放文本内容
    
    file1 db 'abc.txt',0
    file1h dw ?
    
    file2 db 'def.txt',0
    file2h dw ?
  
    buf2 db 100 dup(?)
    
    error_meg db 0dh,0ah,'error','$' 
    success_meg db 0dh,0ah,'success','$' 
DATAS ENDS

STACKS SEGMENT
    ;此处输入堆栈段代码
    dw 20h dup(?)
    top label word
STACKS ENDS

CODES SEGMENT
    ASSUME CS:CODES,DS:DATAS,SS:STACKS
main proc far
    MOV AX,DATAS
    MOV DS,AX
    mov ax,stacks
    mov ss,ax
    lea sp,top
    
    ;此处输入代码段代码
    
    ;创建文件
    lea dx,file1
    mov cx,0
    mov ah,3ch
    int 21h
    jc error
    mov file1h,ax
    
    ;buf1
    lea dx,buf1
    mov ah,0ah
    int 21h
    
    ;得到buf1的长度
    xor ch,ch
    mov cl,[buf1+1]
    
    ;将内容写入buf1
    lea dx,buf1+2
    mov bx,file1h
    mov ah,40h
    int 21h
    jc error
    
    ;创建文件file2
    lea dx,file2
    mov cx,0
    mov ah,3ch
    int 21h
    jc error
    mov file2h,ax
    
    xor cx,cx
    xor dx,dx
    mov bx,file1h
    mov al,0
    mov ah,42h
    int 21h
    jc error
    
    ;读取file1的内容
    lea dx,buf2
    mov bx,file1h
    xor ch,0
    mov cx,10;读取前10个字符
    mov cl,[buf1+1]
    mov ah,3fh
    int 21h
    jc error
    
    ;显示内容
    xor ch,0
    mov cx,10;显示前10个字符
    mov cl,[buf1+1]
    lea si,buf2
q1: mov dl,[si]
	inc si
	mov ah,02h
	int 21h
	loop q1
	
	;将内容写入file2
	lea dx,file2
	mov bx,file2h
	mov ch,0
	mov cx,10
	mov cl,[buf1+1]
	mov ah,40h
	int 21h
	jc error
	jmp exit

error:
	lea dx,error_meg
	mov ah,09h
	int 21h	
	
exit:
    lea dx,success_meg
	mov ah,09h
	int 21h		    
    MOV AH,4CH
    INT 21H
    main endp
CODES ENDS
    END main

二分查找

DATAS SEGMENT
    ;此处输入数据段代码
    VALUME    DW 42H
    LOW_IDX   DW ?
    HIGH_IDX  DW ?
      
DATAS ENDS

ESEG SEGMENT
    ;此处输入附加段代码
    ;数组第一个元素存放数组长度
     LIST     DW 10,11H,34H,42H,66H,78H,98H,111H,222H,777H,999H
ESEG ENDS     

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

CODES SEGMENT
    ASSUME CS:CODES,DS:DATAS,ES:ESEG
    ;此处输入代码段代码
B_SEARCH PROC NEAR
    PUSH DS
    MOV AX,0
    PUSH AX
    MOV AX,DATAS
    MOV DS,AX
    MOV AX,ESEG
    MOV ES,AX
    
    LEA DI,LIST
    MOV AX,VALUME
    CMP AX,ES:[DI+2]
    JA CHK_LAST
    CLC
    LEA SI,ES:[DI+2]
    JE EXIT
    STC              ;如果VALUME<第一个数组元素,置CF=1
    JMP EXIT
    
CHK_LAST:
    MOV SI,ES:[DI]
    SHL SI,1
    ADD SI,DI
    CMP AX,ES:[SI]
    JB SEARCH
    CLC
    JE EXIT
    STC              ;如果VALUME>最后一个数组元素,置CF=1
    JMP EXIT

SEARCH:
    MOV LOW_IDX,1
    MOV BX,ES:[DI]
    MOV HIGH_IDX,BX
    MOV BX,DI

MID:                  
    MOV CX,LOW_IDX
    MOV DX,HIGH_IDX
    CMP CX,DX
    JA NO_MATCH
    ADD CX,DX
    SHR CX,1
    MOV SI,CX
    SHL SI,1
    
COMPARE:
    CMP AX,ES:[BX+SI]
    JE EXIT
    JA HIGHER
    DEC CX
    MOV HIGH_IDX,CX
    JMP MID
    
HIGHER:
    INC CX
    MOV LOW_IDX,CX
    JMP MID
    
NO_MATCH:
    STC

EXIT:RET                       

B_SEARCH ENDP  
CODES ENDS
    END B_SEARCH

计算3!+4!+5!

DATA SEGMENT 
	N DB 5
	RESULT DW 0
DATA ENDS 
STACK SEGMENT 
	DW 20H DUP(0)
STACK ENDS 
CODE SEGMENT 
	ASSUME CS:CODE,DS:DATA,SS:STACK 
BEGIN: 
	MOV AX,DATA
	MOV DS,AX
	MOV AL,N
	CALL FACT;调用阶乘子程序计算5!
	MOV RESULT,DX
	DEC N
	MOV AL,N
	CALL FACT;调用阶乘子程序计算4!
	ADD RESULT,DX
	DEC N
	MOV AL,N
	CALL FACT;调用阶乘子程序计算3!
	ADD RESULT,DX
	MOV AH,4CH
	INT 21H
	
FACT PROC NEAR;阶乘子程序
	MOV DX,1
	CMP AL,0
	JZ DONE
	PUSH AX
	DEC AL
	CALL FACT
	POP AX
	MUL DL
	MOV DX,AX
DONE: RET 
FACT ENDP 
CODE ENDS 
END BEGIN

将abc.txt的前10个字符复制到def.txt

DATAS SEGMENT
    ;此处输入数据段代码  
    pathname1 db 'abc.txt',0
    pathname2 db 'def.txt',0
    opnmsg db 'open error$'
    opnok db 'open finish',0dh,0ah,'$'
    wrtmsg db 'write error$'
    wrtok db 'write finish',0dh,0ah,'$'
    cpymsg db 'write error$'
    cpyok db 'copy finish',0dh,0ah,'$'
    clsok db 'close finish',0dh,0ah,'$'
    str1 db 'Input the content of abc.txt:$'
    errcde db 0   ;错误码
    handle dw ?   ;公用文件号
    handle1 dw ?  ;abc文件号
    handle2 dw ?  ;def文件号
    content db 100 dup(?),'$'
DATAS ENDS

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

CODES SEGMENT
main proc far
    ASSUME CS:CODES,DS:DATAS,SS:STACKS

    MOV AX,DATAS
    MOV DS,AX
    ;新建文件abc
    mov ax,0
    lea dx,pathname1
    call newfile
    cmp errcde,0
    jz contin1
    jmp exit
    
contin1:
	;新建完成提示
	lea dx,opnok
	mov ah,09h
	int 21h
	mov bx,handle
	mov handle1,bx
	mov bx,0
	;输入文件内容
	call proch
    cmp errcde,0
    jz contin2
    jmp exit
    
contin2:
	;输入完成提示
	mov dx,offset wrtok
	mov ah,09h
	int 21h
	;新建文件def
	lea dx,pathname2
    call newfile
    cmp errcde,0
    jz contin3
    jmp exit
contin3:
	;新建完成提示
	lea dx,opnok
	mov ah,09h
	int 21h
	mov bx,handle
	mov handle2,bx
	mov bx,0
	;复制文件
	call copy
	cmp errcde,0
    jz contin4
    jmp exit
contin4:
	;复制完成提示
	lea dx,cpyok
	mov ah,09h
	int 21h
	;关闭文件
	mov bx,handle1
	call clseh
	mov bx,handle2
	call clseh
	;关闭文件完成提示
	lea dx,clsok
	mov ah,09h
	int 21h
exit:
    MOV AH,4CH
    INT 21H
main endp


;creat file 
newfile proc near
	mov ah,3ch
	mov cx,0
	int 21h
	jc a1
	mov handle ,ax
	ret
a1: mov dx,offset opnmsg    ;error
	MOV AH,09H
    INT 21H
	call errm
	ret
newfile endp

;input
proch proc near
	mov ah,09h
	mov dx,offset str1
	int 21h
	
	mov di,0
b1:
	;输入
	 mov ah,01
	 int 21h
	;判断回车
	 cmp al,0dh
	 je b2
	;存入inpuf
	 mov content[di],al
	 inc di
	 jmp b1
b2:
	;输入完成,写入文件
	mov ah,40h
	mov bx,handle1
	mov cx,di
	lea dx,content
	int 21h
	jc b3
	cmp ax,di
	jne b3
	ret
b3:
	mov dx,offset wrtmsg    ;error
	MOV AH,09H
    INT 21H
	call errm
	
	ret
proch endp

copy proc near
	mov ah,40h
	mov bx,handle2
	mov cx,10;复制前10个字符
	lea dx,content
	int 21h
	jc c1
	cmp ax,10
	jne c1
	ret
c1:
	mov dx,offset cpymsg    ;error
	MOV AH,09H
    INT 21H
	call errm
	
	ret
copy endp

clseh proc near
	mov ah,3eh
	int 21h
	ret
clseh endp

;error
errm proc near
	mov errcde,01
	ret
errm endp
    
CODES ENDS
    END main


将AX分4组分别放入AL_BL_CL_DL

DATAS SEGMENT
    ;此处输入数据段代码
DATAS ENDS

STACKS SEGMENT
    ;此处输入堆栈段代码
    DB 90H DUP(?)
STACKS ENDS

CODES SEGMENT
    ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
    MOV AX,DATAS
    MOV DS,AX
    ;此处输入代码段代码
	MOV AX,1234H
	MOV BX,AX
	MOV CX,AX
	MOV DX,AX
	
	AND AL,0FH;AL=04
	MOV CL,4
	SHR BL,CL;BL=03
	AND CH,0FH;CH=2
	MOV CL,4
	SHR DH,CL
	MOV DL,DH;DL=01
	
	MOV CL,CH;CL=2
	
	MOV AH,4CH
    INT 21H
CODES ENDS
    END START



将小写转换成大写

DATAS SEGMENT
    ;此处输入数据段代码
DATAS ENDS

STACKS SEGMENT
    ;此处输入堆栈段代码
    DB 90H DUP(?)
STACKS ENDS

CODES SEGMENT
    ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
    MOV AX,DATAS
    MOV DS,AX
    ;此处输入代码段代码
INPUT:	
	MOV AH,1H
	INT 21H
	
	CMP AL,0DH
	JZ EXIT
	CMP AL,'a'
	JB INPUT
	CMP AL,'z'
	JA INPUT
	
	SUB AL,20H
	MOV DL,AL
	MOV AH,02H
	INT 21H
	JMP INPUT

EXIT:	
    MOV AH,4CH
    INT 21H
CODES ENDS
    END START




逆序输出

DATAS SEGMENT
    ;此处输入数据段代码  
    STRING DB 300 DUP(?)
DATAS ENDS

STACKS SEGMENT
    ;此处输入堆栈段代码
    DW 10 DUP(?)
    TOP LABEL WORD
STACKS ENDS

CODES SEGMENT
    ASSUME CS:CODES,DS:DATAS,SS:STACKS
    MAIN PROC FAR
    MOV AX,DATAS
    MOV DS,AX
    ;此处输入代码段代码
    MOV AX,STACKS
    MOV SS,AX
    LEA SP,TOP
    LEA SI,STRING
    
    MOV CX,0
    L1:
    MOV AH,1 ;注意字符串长度超过253不能用0AH号调用
    INT 21H
    
    CMP AL,0DH ;回车结束输入
    JE L2 ;ZF=0跳转
    MOV [SI],AL
    INC CX
    INC SI
    JMP L1
    
    L2:
    MOV DL,0DH
    MOV AH,2
    INT 21H
    
    MOV DL,0AH
    MOV AH,2
    INT 21H
    
    LEA SI,STRING
    ADD SI,CX
    DEC SI
    STD ;DF=1,地址从高到低
    
    L3:
    LODSB ;把SI指向的存储单元读入累加器,LODSB就读入AL
    MOV DL,AL
    MOV AH,2
    INT 21H
    LOOP L3
    
    MOV AH,4CH
    INT 21H
    MAIN ENDP
CODES ENDS
    END MAIN

冒泡排序

完整的实验报告戳冒泡排序实验报告

DATAS SEGMENT
    ;此处输入数据段代码 
    STR1 DB 'How many data to input? (less than or enqual to 100)$'
    STR2 DB 'Input $'
    STR3 DB ' datas,press [Enter] after input each data.$'
    STR4 DB 'Before sorting:$'
    STR5 DB 'After sorted:$'
    num  DW ?             ;存放需排序num个数
    buf  DW 100 dup(?)    ;存放输入的数据
    
DATAS ENDS

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

CODES SEGMENT
    ASSUME CS:CODES,DS:DATAS,SS:STACKS
    
;主函数main    
main proc near   
    MOV AX,DATAS
    MOV DS,AX
    ;此处输入代码段代码
    MOV BX,0
	MOV SI,10
	MOV cx,0
    ;---------------初始界面
    CALL init
    
    ;---------------输入需排序num个数
    CALL inputNum
    
    MOV DL,0AH      ;回车换行
    MOV AH,02H
    INT 21H          
    
    ;---------------输出提示语
    CALL lead
    
    ;---------------输入数据
    CALL inputData
    
    ;---------------输出未排序的数据
    CALL outputUnsortedData
    
    ;---------------输出排好序的数据
    CALL outputSortedData
    
    MOV AH,4CH     ;注意其位置在main内
    INT 21H
main endp
    
;初始界面:显示提示语STR1
init proc near   
    LEA DX,STR1    ;等价于MOV DX,OFFSET STR1
    MOV AH,09H
    INT 21H        ;不可漏写INT 21H,否则输出内容会一闪而过
    MOV AH,02H
    MOV DL,0AH     ;回车换行
    INT 21H
    RET
init endp

;输入num
inputNum proc near 
    MOV BX,0 
L0: MOV AH,01H
    INT 21H
    SUB AL,30H      ;AL中的值-0的ASCII码得到数字
    CMP AL,0
    JL back         ;JUMP LESS <0跳转    
    CMP AL,9
    JG back         ;JUMP GREAT >9跳转
    CBW             ;AL扩展成AX AL表示的范围比较小
    XCHG AX,BX      ;倘若不扩展XCHG和ADD指令的AX,BX改成AL,BL
    MUL SI          ;按输入顺序将(0-9*10^n移到相应的位子上
    XCHG AX,BX
    ADD BX,AX       ;BX存放num的值
    JMP L0
back:RET
inputNum endp    

;输出提示语STR2和STR3
lead proc near     
    LEA DX,STR2
    MOV AH,09H
    INT 21H
    MOV num,BX      ;num=用户输入的个数
    CALL outputNum  ;输出num
    LEA DX,str3
    MOV AH,09H
    INT 21H 
    RET
lead endp 

;输出num
outputNum proc near
    MOV AX,BX
L1:
    XOR DX,DX
    DIV SI           ;DIV SI与输入时MUL SI相对
    PUSH DX
    INC CX
    CMP AX,0
    JNZ L1           ;JUMP NOT ZORO
L2:
    POP DX
    MOV AH,02H
    ADD DL,30H       ;+0的ASCII码恢复十进制输出
    INT 21H
    LOOP L2
    RET
outputNum endp 

;输入数据
inputData proc near
    MOV DL,0AH       ;回车换行
    MOV AH,02H
    INT 21H          
    MOV CX,num       ;num的值作为循环次数
    MOV DI,0
L3: CALL inputNum
    MOV DL,0AH       ;回车换行
    MOV AH,02H
    INT 21H  
    MOV buf[di],BX   ;将输入的数据存入数组buf中   
    ADD DI,2
    LOOP L3
    RET    
inputData endp   

;输出数据
outputData proc near   
    MOV BP,num       ;用CX和LOOP会乱码,改用BP和JNZ实现循环
    MOV DI,0
L4: MOV BX,buf[DI]
    CALL outputNum
    MOV DL,20H
    MOV AH,02H
    INT 21H          ;数据间空格分离
    ADD DI,2
    DEC BP
    JNZ L4           ;JUMP IF NOT ZORO
    RET
outputData endp

;输出排序前的数组
outputUnsortedData proc near
    LEA DX,STR4
    MOV AH,09H
    INT 21H
    CALL outputData
    MOV DX,0AH       ;回车换行
    MOV AH,02H
    INT 21H            
    RET
outputUnsortedData endp

;输出排序后的数组
outputSortedData proc near
    LEA DX,STR5
    MOV AH,09H
    INT 21H
    CALL bubbleSort
    CALL outputData
    RET
outputSortedData endp

;冒泡排序
bubbleSort proc near
    MOV CX,num
    DEC CX           ;[0,num-1]
loop1: 
    MOV DI,CX
    MOV BX,0
loop2: 
    MOV AX,buf[BX]
    CMP AX,buf[BX+2]
    JNG continue     ;JUMP IF buf[BX]<=buf[BX+2]
    XCHG AX,buf[BX+2]
    MOV buf[BX],AX
continue:
    ADD BX,2
    LOOP loop2
    MOV CX,DI
    LOOP loop1
    RET       
bubbleSort endp
              

CODES ENDS
    END main





输入输出有符号数

DATA SEGMENT
str1 db 'please input a signed number: $'
DATA ENDS

CODE SEGMENT
ASSUME CS:CODE, DS:DATA

;------------------------主程序
main proc near  
    MOV AX,DATA
    MOV DS,AX
       
    lea dx,str1
    mov ah,9
    int 21h
    
    call inputData
     
    
    call outputData

     
    MOV AH,4CH
    INT 21H
main endp
 

;------------------------输入数据  
inputData proc near
    push bx
    push cx
    push dx
    xor bx,bx   ;BX保存结果,bx=0
    xor cx,cx   ;CX表正负,初始化为00为正,-1为负
    mov ah,1
    int 21h
    cmp al,'+'
    jz input1
    cmp al,'-'
    jnz input2
    mov cx,-1
input1: 
	mov ah,1
    int 21h
input2:    
	cmp al,'0' ;输入数据<0>9结束输入
    jb endInput
    cmp al,'9'
    ja endInput
    sub al,30h
    xor ah,ah
    shl bx,1
    mov dx,bx
    shl bx,1
    shl bx,1
    add bx,dx
    add bx,ax
    jmp input1
endInput:
	cmp cx,0
    jz exitInput
    neg bx     ;cx为0即bx为正数,cx=-1即bx为负数需要求补
exitInput:
	mov ax,bx
    pop dx
    pop cx
    pop bx
    ret
inputData endp

;------------------------输出数据  
outputData proc near
    push ax
    push bx
    push dx
    test ax,ax  ;判断数据是零、正数或负数
    jnz output1
    mov dl,'0'  ;数据是零,显示“0”后退出
    mov ah,2
    int 21h
    jmp exitOutput
output1:
	jns output2 ;数据是负数,显示“-”
    mov bx,ax
    mov dl,'-'
    mov ah,2
    int 21h
    mov ax,bx
    neg ax      ;数据求补
output2:  
	mov bx,10
    push bx     ;10压入堆栈,作为退出标志
output3:
	cmp ax,0
    jz output
    xor dx,dx   
    div bx  
    add dl,30h  ;余数(09)转换为ASCII码
    push dx     ;数据各位先低位后高位压入堆栈
    jmp output3
output:
	pop dx
    cmp dl,10
    je exitOutput
    mov ah,2
    int 21h
    jmp output
exitOutput:
    pop dx
    pop bx
    pop ax
    ret
outputData endp

CODE ENDS
END main










输入姓名和8个字符的电话号码

DATAS SEGMENT
    ;此处输入数据段代码 
    a_name db 20
    a_phone db 8 
    
    message1 db 'input name: $'
    message2 db 'input a telephone number:','$'
    message3 db 'NAME',16 dup(20h),'TEL',13,10,'$'
    error_message1 db 'Please input 8 numbers',13,10,'$'
    error_message2 db 'Please input a right number',13,10,'$'
    
    inbuf db 20 dup(?)
    outname db 20 dup(?),'$'
    outphone db 8 dup(?),'$'
    
    flag db ?
DATAS ENDS

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

CODES SEGMENT
;-----------------------------主程序
main proc far
    ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
    	MOV AX,DATAS
    	MOV DS,AX
    	mov flag,0
    
   		lea dx,message1      ;显示提示符INPUT NAME:       
    	mov ah,09h
    	int 21h
    
    	call input_name      ;调用子程序INPUT_NAME输入姓名:
    	call crlf
    
    	lea dx,message2		 ;显示提示符INPUT A TELEPHONE NUMBER
    	mov ah,09h
    	int 21h
    	
    	call inphone         ;调用子程序INPHONE输入电话号码
    	call crlf
    	
    	cmp flag,1
    	je exit
    	
    	call printline

	exit:
		ret
main endp   
 
;-----------------------------子程序INPUT_NAME输入姓名    
input_name proc near
		push ax
		push dx
		push cx
	
		mov cx,0
		mov cl,a_name
		call getchar
	
		mov ax,0
		mov al,a_name
		sub ax,cx              ;ax = 输入的名字长度
	
		mov cx,ax
		mov si,0
	next1:
		mov al,inbuf[si]
		mov outname[si],al
		inc si
		loop next1
	
		pop cx
		pop dx
		pop ax
	
		ret
input_name endp    

;-------------------------------子程序回车换行
crlf proc near
		push ax
		push dx
	
		mov dl,13
		mov ah,02h
		int 21h
	
		mov dl,10
		mov ah,02h
		int 21h
	
		pop dx
		pop ax
		ret
crlf endp

;-----------------------------子程序getchar把输入的内容存放在INBUF缓冲区中
getchar proc near
		push ax 
		push dx
	
		mov di,0
	rotate:
		mov ah,01h
		int 21h
		
		cmp al,13
		je exit1
		
		mov inbuf[di],al
		inc di
		
		loop rotate
		
	exit1:
		pop dx
		pop ax
		ret
getchar endp

;-----------------------------子程序inphone输入电话号码
inphone proc near
		push ax
		push dx
		
		mov cx,0
		mov cl,a_phone
		call getchar
		
		cmp cx,0
		jnz error1
		
		mov cl,a_phone
		mov si,0
		
	next2:
		mov al,inbuf[si]
		
		cmp al,30h            
		jl error2
		cmp al,39h
		ja error2
		
		mov outphone[si],al
		inc si	
		loop next2
		
		jmp exit2
		
	error1:
		call crlf
		lea dx,error_message1;输入错误1:电话号码长度不是8位
		mov ah,09h
		int 21h
		
		mov flag,1
		jmp exit2
		
	error2:
		call crlf
		lea dx,error_message2;输入错误2:电话号码不是数字
		mov ah,09h
		int 21h
		
		mov flag,1
		jmp exit2
		
	exit2:
		pop dx
		pop ax
		ret
inphone endp

;-----------------------------子程序PRINTLINE显示姓名和电话号码
printline proc near
		push ax
		push dx
		
		lea dx,message3
		mov ah,09h
		int 21h
		
		lea dx,outname
		mov ah,09h
		int 21h
		lea dx,outphone
		mov ah,09h
		int 21h
		
		pop dx
		pop ax
		ret
printline endp

CODES ENDS
    END main















字符串匹配

DATA SEGMENT
     ;此处输入数据段代码
     STRING1 DB 'abcDEF'
	 STRING2 DB 'abcDEF'
	 
	 LEN1 DW $ - STRING1
	 LEN2 DW $ - STRING2
	 
	 STRING3 DB 'MATCH$'
	 STRING4 DB 'NO MATCH$'
DATA ENDS
STACK SEGMENT stack
	  ;此处输入堆栈段代码
      DW 5 DUP(?)
	  TOP LABEL WORD
STACK ENDS
CODE SEGMENT
   ASSUME CS:CODE,DS:DATA,SS:STACK
MAIN PROC FAR ;DOS内核与主程序不在同一个段地址内用far(near) 
     MOV AX,STACK
	 MOV SS,AX
	 LEA SP,TOP
	 MOV AX,DATA
	 MOV DS,AX
	 ;此处输入代码段代码
	 MOV ES,AX
	 MOV CX,LEN1
	 CMP CX,LEN2
	 JNE L1 ;Jump if not equal
	 LEA SI,STRING1
	 LEA DI,STRING2
	 CLD
	 REPE CMPSB
	 JNZ L1 ;Jump if not zero/equal
	 LEA DX,STRING3 ;取偏移地址
	 JMP L2 ;无条件跳转到L2
  L1:LEA DX,STRING4
  L2:MOV AH,9
	 INT 21H
	 MOV AH,4CH
	 INT 21H
MAIN ENDP
CODE ENDS
     END MAIN 





子程序嵌套程序

完整的实验报告戳子程序嵌套程序实验报告

data segment
No_of_name db 20
No_of_phone db 8
inbuf db 20 dup(?)?
outname db 20 dup(?),'$'
outphone db 8 dup(?),'$'
message1 db 'please input name:','$'
message2 db 'please input a telephone number:','$'
message3 db 'NAME',16 dup(20h),'TEL.',13,10,'$'
errormessage1 db 'you should input 8 numbers!',13,10,'$'
errormessage2 db 'you input a wrong number!',13,10,'$'
flag db ?
data ends
;**************************************************************
prog segment
;--------------------------------------------------------------
main proc far
assume cs:prog,ds:data
start:
push ds
sub ax,ax
push ax
?
mov ax,data
mov ds,ax
mov flag,0

lea dx,message1
mov ah,09
int 21h

call input_name
call crlf

lea dx,message2
mov ah,09
int 21h

call inphone
call crlf

cmp flag,1
je exit

call printline
exit:
ret
main endp
;------------------------------------------------------------
input_name proc near
push ax
push dx
push cx

mov cx,0
mov cl,No_of_name
call getchar
??????
mov ax,0
mov al,No_of_name
sub ax,cx

mov cx,ax
mov si,0
next1:??????
mov al,inbuf[si]
mov outname[si],al
inc si
??????
loop next1

pop cx
pop dx
pop ax

ret
input_name endp
;-------------------------------------------------------------
inphone proc near
push ax
push dx
??????
mov cx,0
mov cl,No_of_phone
call getchar

cmp cx,0
jnz error1

mov cl,No_of_phone??
mov si,0
??????
next2:??????
mov al,inbuf[si]
??????
cmp al,30h
jl error2

cmp al,39h
ja error2

mov outphone[si],al
inc si
??????
loop next2
jmp exit2
error1:
call crlf
lea dx,errormessage1
mov ah,09
int 21h

mov flag,1
jmp exit2
error2:
call crlf
lea dx,errormessage2
mov ah,09
int 21h

mov flag,1
jmp exit2
exit2:
pop dx
pop ax

ret
inphone endp
;---------------------------------------------------------
getchar proc near
push ax
push dx

mov di,0
rotate:
mov ah,01
int 21h

cmp al,0dh
je exit1

mov inbuf[di],al
inc di

loop rotate
exit1:
pop dx
pop ax
ret
getchar endp
;----------------------------------------------------------
crlf proc near
push ax
push dx

mov dl,0dh
mov ah,2

int 21h
mov dl,0ah

mov ah,2
int 21h
?
pop dx
pop ax

ret

crlf endp
;---------------------------------------------------------
printline proc near
push ax
push dx

lea dx,message3
mov ah,09
int 21h
????????
lea dx,outname
mov ah,09
int 21h

lea dx,outphone
mov ah,09
int 21h

pop dx
pop ax

ret
printline endp
;---------------------------------------------------------
prog ends
;*********************************************************
end main


  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值