几个汇编小程序

1. 输入HelloWorld,输出helloWorld

data segment
     buffer db 20,?,21 dup('$')
data ends
 
code segment
     assume cs:code,ds:data
     start:
     mov ax,seg buffer
     mov ds,ax
     mov dx,offset buffer
     mov ah,10
     int 21h
 
     
     mov buffer[0],0dh
     mov buffer[1],0ah
     mov bx,2
     add buffer[bx],20h ;将首字母变为小写h
     mov ax,seg buffer
     mov ds,ax
     mov dx,offset buffer

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

2.冒泡排序

data segment
	stu 	dw 50,60,70,80,90,80
		dw 50,60,70,80,90,80
		dw 50,60,70,80,90,80
		dw 50,60,70,80,90,80
		dw 50,60,70,80,90,80
	sign dw ?
data ends

code segment
assume cs:code,ds:data
start:
	mov ax,data
	mov ds,ax

	mov cx,sign-stu
	shr cx,1;元素个数
	dec cx	  ;比较到最后一个元素的前一个
loop1:
	push cx;保存外循环次数
	mov bx,0
loop2:
	mov ax,stu[bx]
	cmp ax,stu[bx+2]
	jle next;小于等于则跳转互换,升序
	xchg ax,stu[bx+2]
	mov stu[bx],ax
next:
	add bx,2
	loop loop2
	pop cx;恢复外循环次数
	loop loop1
	mov ah,4ch
	int 21h	
code ends
end start

3. 统计班级内60分以下的同学个数存入min数组,90分以上的同学个数放入max数组

data segment
score db 23,22,35,66,90
	db 23,60,35,66,95
	db 23,22,70,66,91
max db 3 dup(0)
min db 3 dup(0)
sn db 0
cn db 0
data ends
code segment
assume cs:code,ds:data
start:
	mov ax,data
	mov ds,ax
outs:
	cmp cn,3
	jae exit ;如果遍历完第三个班级则退出
	mov sn,0 ;没有遍历完则从第0个学生开始
ins:
	cmp sn,5;是否遍历到班级里的最后一名学生
	jae outs1;如果遍历到最后一名则跳到outs1使班级加一
	mov al,cn
	mov cl,5
	mul cl;al=cn*5
	mov bx,ax;bx中存的是学生的起始地址
	mov al,sn
	mov ah,0
	mov si,ax;si中存的是第几个学生
	cmp score[bx][si],90
	jb flunk;如果小于90的话跳到flunk
	mov al,cn
	mov ah,0
	mov di,ax
	inc max[di]
	jmp ins1
flunk:
	cmp score[bx][si],60
	jae ins1;如果大于60则跳到ins1
	mov al,cn
	mov ah,0
	mov di,ax
	inc min[di]
ins1:
	inc sn;学生加一
	jmp ins
outs1:
	inc cn;班级数加一
	jmp outs
exit:
	mov ah,4ch
	int 21h
code ends
end start

4.,输入X,输出Y=2*X+3

data segment
	table dw prog0,prog1,prog2,prog3
	mess db 0ah,0dh,'input0-3:$'
	buffer db 80,?,80 dup(?)
	buffer1 db 'X:$'
	buffer2 db 0dh,0ah,'Y=2*X+3=$'
data ends
code segment
	assume cs:code,ds:data
start:
	mov ax,data
	mov ds,ax
let0:
	mov dx,offset mess
	mov ah,9
	int 21h
	mov ah,1
	int 21h
	and al,03h;保留al最低两位,其余位清零
	mov ah,0
	shl ax,1;左移一位相当于乘以2
	mov bx,ax
	jmp table[bx]
prog1:		;输出字符串
	mov dl,0ah
	mov ah,2
	int 21h
	lea dx,buffer		;输入字符串
	mov ah,10
	int 21h
	mov bx,1			;调整buffer
	add bl,buffer[bx]
	mov bh,0
	add bx,2
	mov buffer[bx],'$'	;增加结束标志’$‘
	mov bx,0
	mov buffer[bx],0ah	;换行
	mov bx,1
	mov buffer[bx],0dh
	mov ah,9
	int 21h
	jmp let0			;返回菜单
prog2:		
	mov dl,0ah
	mov ah,2
	int 21h
	lea dx,buffer1		
	mov ah,9h
	int 21h
	mov ah,1h		
	int 21h
	sub al,30h		
	sal al,1			
	aam					;乘法调整
	add al,3h			
	aaa					;加法调整
	add ax,3030h			
	mov bx,ax
	lea dx,buffer2	
	mov ah,9h
	int 21h
	mov dl,bh		
	mov ah,2h
	int 21h
	mov dl,bl
	int 21h
	jmp let0
prog3:		;大写转小写
	mov dl,0ah
	mov ah,2
	int 21h
	mov ah,1			
	int 21h
	test al,20h	
	jz let1			
	and al,0dfh	
	jmp let2
	let1:
	or al,20h			
	let2:
	mov dl,al			
	mov ah,2
	int 21h
	jmp let0
prog0:
	mov ah,4ch	
	int 21h
code ends
	end start

 

5.输入学生学号,输出学生姓名

data segment
	stu0 db 0dh,0ah,'stu0$'
	stu1 db 0dh,0ah,'stu1$'
	stu2 db 0dh,0ah,'stu2$'
	stu3 db 0dh,0ah,'stu3$'
	stu4 db 0dh,0ah,'stu4$'
	stu5 db 0dh,0ah,'stu5$'
	info db 0dh,0ah,'please input a stu number:$'
data ends
code segment
assume cs:code,ds:data
start:
	mov ax,data
	mov ds,ax
	mov dx,offset info
	mov ah,9
	int 21h
	mov ah,1
	int 21h
	sub al,30h
	mov cl,7
	mul cl;ax=al*cl
	mov dx,ax
	mov ah,9
	int 21h
	mov ah,4ch
	int 21h
	
code ends
end start

你可能感兴趣的:(其他)