【汇编语言】编程题目(二)

将内存单元中的x,y两个数交换一下

assume cs:code,ds:data
data segment
x dw 32
y dw 78
data ends
code segment
start:
	mov ax,data
	mov ds,ax
	mov ax,word ptr x
	xchg ax,word ptr y
	mov word ptr x,ax
	mov ax,4c00h
	int 21h
code ends
end start

给定一个数字n(0~9),输出n

assume cs:code,ds:data
data segment
n db 6
data ends
code segment
start:
	mov ax,data
	mov ds,ax
	mov dl,30h
	add dl,byte ptr n
	mov ah,02h
	int 21h
	mov ax,4c00h
	int 21h
	
code ends
end start

将一个字节数据以十六进制数形式显示

assume cs:code,ds:data
data segment
n db 3fh
ascll db '0','1','2','3','4','5','6','7','8','9'
        db 'A','B','C','D','E','F'
data ends
code segment
start:
	mov ax,data
	mov ds,ax
	
	mov bx,offset ascll
	mov al,n
	and al,0f0h
	mov cl,4
	shr al,cl
	xlat
	mov dl,al
	mov ah,02h
	int 21h

	mov al,n
	and al,0fh
	xlat
	mov dl,al
	mov ah,02h
	int 21h
	mov dl,'H'
	mov ah,02h
	int 21h
	
	mov ax,4c00h
	int 21h

code ends
end start

求1+2+…+n,只允许使用跳转语句,不准使用loop

assume cs:code,ds:data
data segment
n  dw 100
sum dw ?
data ends
code segment
start:
	mov ax,data
	mov ds,ax
	mov cx,word ptr n
	mov ax,0
again:	add ax,cx
	dec cx
	cmp cx,0
	ja again
	mov word ptr sum,ax
	mov ax,4c00h
	int 21h
	
code ends
end start

计算n! ,不准使用loop

assume cs:code,ds:data
data segment
n dw 5
fac dw ?
data ends
code segment
start:
	mov ax,data
	mov ds,ax
	mov ax,1
	mov cx,word ptr n
again:	cmp cx,0
	je next
	mul cx
	dec cx
	jmp again
next:	mov word ptr fac,ax
	mov ax,4c00h
	int 21h

	
code ends
end start

求分段函数,当x < 1 , y = 2x + 3,当x < 10,y = 3x + 7, 否则y = 5*x + 2

assume cs:code,ds:data
data segment
x  dw 3
y dw ?
data ends
code segment
start:
	mov ax,data
	mov ds,ax
	mov ax,word ptr x
	cmp ax,1
	jl l1
	cmp ax,10
	jl l2
	mov cl,2
	shl ax,cl
	add ax,word ptr x
	add ax,2
	jmp next

l1:	shl ax,1
	add ax,3
	jmp next
l2:	shl ax,1
	add ax,word ptr x
	add ax,7
next:	mov word ptr y,ax
	mov ax,4c00h
	int 21h

	
code ends
end start

内存单元中的n存放一个小写字母,输出其大写形式

assume cs:code,ds:data
data segment
n db 'y'
data ends
code segment
start:
	mov ax,data
	mov ds,ax
	mov dl , byte ptr n
	sub dl,32
	mov ah, 02h
	int 21h
	mov ax,4c00h
	int 21h

	
code ends
end start

将一个三位数输出到屏幕上

assume cs:code,ds:data
data segment
n dw 285
data ends
code segment
start:
	mov ax,data
	mov ds,ax
	mov cl,100
	mov ax,word ptr n
	div cl
	mov dl,30h
	add dl,al
	mov ah,02h
	int 21h
	mov cl,10
	mov ax,word ptr n
	div cl
	mov ah,0
	div cl
	mov dl,30h
	add dl,ah
	mov ah,02h
	int 21h
	mov cl,10
	mov ax,word ptr n
	div cl	
	mov dl,30h
	add dl,ah
	mov ah,02h
	int 21h
	mov ax,4c00h
	int 21h

	
code ends
end start

输出一个十进制的数(三位数)

assume cs:code,ds:data,ss:stack
stack segment
s db 1024 dup(?)
stack ends
data segment
n dw 479
result dw ?
data ends
code segment
start:
	mov ax,data
	mov ds,ax
	mov ax,stack
	mov ss,ax
	push word ptr n
	call output
	mov ax,4c00h
	int 21h
output proc
push bp
mov bp,sp
push ax
push bx
push cx
push dx
mov cx,3
mov bx,10
mov ax,word ptr [bp+4]
l1: xor dx,dx
div bx
add dl,30h
push dx
loop l1
mov cx,3
l2:pop dx
mov ah,02h
int 21h
loop l2
pop dx
pop cx
pop bx
pop ax
pop bp
ret 2
output endp
	
code ends
end start

注意的是:xor dx ,dx一定不能省,不知道为什么没有这个,dosbox
会死机。

输出一个十进制的数

assume cs:code,ds:data,ss:stack
stack segment
s db 1024 dup(?)
stack ends
data segment
n dw 47932
result dw ?
data ends
code segment
start:
	mov ax,data
	mov ds,ax
	mov ax,stack
	mov ss,ax
	push word ptr n
	call output
	mov ax,4c00h
	int 21h
output proc
push bp
mov bp,sp
push ax
push bx
push dx
mov bx,-1
push bx
mov bx,10
mov ax,word ptr [bp+4]
l1: cmp ax,0
jz l2
xor dx,dx
div bx
add dl,30h
push dx
jmp l1
l2:pop dx
cmp dx,-1
jz done
mov ah,02h
int 21h
jmp l2
done:pop dx
pop bx
pop ax
pop bp
ret 2
output endp
	
code ends
end start

将一个字符串中的小写字母转变为大写字母并输出

assume cs:code,ds:data,ss:stack
stack segment
s db 1024 dup(?)
stack ends
data segment
string db 'hello,world!',0dh,0ah,'$'
data ends
code segment
start:
	mov ax,data
	mov ds,ax
	mov si,offset string
again:	cmp byte ptr[si],'$'
	jz exit
	cmp byte ptr[si],'z'
	ja next
	cmp byte ptr [si],'a'
	jl next
	sub byte ptr[si],20h
next:	inc si
	jmp again
exit:	mov dx,offset string
	mov ah,09h
	int 21h
	mov ax,4c00h
	int 21h
code ends
end start

实现回车换行

print proc		;实现回车换行
push ax
push dx
mov dl,0dh
mov ah,02h
int 21h
mov dl,0ah
mov ah,02h
int 21h
pop dx
pop ax
ret
print endp

从键盘输入一个数,并输出

assume cs:code,ds:data,ss:stack
stack segment
s db 1024 dup(?)
stack ends
data segment
n dw ?
result dw ?
data ends
code segment
start:
	mov ax,data
	mov ds,ax
	mov ax,stack
	mov ss,ax
	sub sp,2
	call input
	pop word ptr n
	push word ptr n
	call output
	mov ax,4c00h
	int 21h
input proc	;从键盘输入一个数,0~65535
push bp
mov bp,sp
push ax
push bx
push cx
mov bx,10
mov word ptr[bp+4],0
again:mov ah,01h
int 21h
cmp al,0dh
je next
xor cx,cx
add cl,al
sub cl,30h
mov ax,word ptr [bp+4]
mul bx
add ax,cx
mov word ptr[bp+4],ax
jmp again
next:pop cx
pop bx
pop ax
pop bp
ret
input endp

output proc	;将刚才输入的数输出到屏幕
push bp
mov bp,sp
push ax
push bx
push dx
mov bx,-1
push bx
mov bx,10
mov ax,word ptr [bp+4]
l1: cmp ax,0
jz l2
xor dx,dx
div bx
add dl,30h
push dx
jmp l1
l2:pop dx
cmp dx,-1
jz done
mov ah,02h
int 21h
jmp l2
done:pop dx
pop bx
pop ax
pop bp
ret 2
output endp
	
code ends
end start

可输出负数的子程序

output proc	;将数输出到屏幕
push bp
mov bp,sp
push ax
push bx
push dx
mov bx,-1
push bx
mov bx,10
mov ax,word ptr [bp+4]
add ax,0
jns l1
mov dl,45
mov ah,02h
int 21h
mov ax,word ptr [bp+4]
neg ax
l1: cmp ax,0
jz l2
xor dx,dx
div bx
add dl,30h
push dx
jmp l1
l2:pop dx
cmp dx,-1
jz done
mov ah,02h
int 21h
jmp l2
done:pop dx
pop bx
pop ax
pop bp
ret 2
output endp

汇编语言实验+题目

  • 1
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
5.1试编写一个汇编语言程序,要求对键盘输入的小写字母用大写字母显示出来。 5.2 编写程序,从键盘接收一个小写字母,然后找出它的前导字符和后续字符,再按顺序输出 5.3 将AX寄存器中的16位数分成4组,每组4位,然后把这四组数分别放在AL、BL、CL、DL中。 5.4 试编写一程序,要求比较两个字符串STRING1和STRING2所含字符是否相同,若相同则显示‘MATCH’,若不相同则显示‘NOT MATCH’。 5.5 试编写一程序,要求能从键盘接收一个个位数N,然后响铃N次。 5.6 编写程序,将一个包含有20个数据的数组M分成两个数组:正数数组P和负数数组N,并分别把这两个数组中的数据的个数显示出来。 5.7 试编制一个汇编语言程序,求出首地址为DATA的100D字数组中的最小偶数,并把它放在AX中。 5.8 把AX中存放的16位二进制数K看作是8个二进制的“四分之一字节”。试编写一个程序,要求数一下值为3(即11B)的四分之一字节数,并将该数在终端上显示出来。 5.9 试编写一汇编语言程序,要求从键盘接收一个四位的十六进制数,并在终端上显示与它等值的二进制数。 5.10 设有一段英文,其字符变量名为ENG,并以$字符结束。试编写一程序,查对单词SUN在该文中的出现次数,并以格式”SUNXXXX“显示出次数。 5.11 从键盘输入一系列以$为结束的字符串,然后对其中的非数字字符进行计数,并显示出计数结果。 5.12 有一个首地址为MEM的100D字数组,试编制程序删除数组中所有为零的项,并将后续项向前压缩,最后将数组的剩余部分补上零。 5.13 在STRING到STRING+99单元中存放着一个字符串,试编制一程序测试该字符串中是否存在数字,如有,则把CL的第五位置1,否则置0. 5.14 在首地址为TABLE的数组中按递增次序存放着100H个16位补码数,试编写一个程序把出现次数最多的数及其出现的次数分别放在AX和CX中。 5.15 数据段中已定义了一个有N个字数据的数组M,试编写一程序求出M中绝对值最大的数,把它放在数据段的M+2n单元中,并将该数的偏移地址存放在M+2(n+1)单元中。 5.16 在首地址为DATA的字数组中,存放了100H个16位补码数,试编写一个程序求出它们的平均值放在AX寄存器中;并求出数组中有多少个数小于此平均值,将结果放在BX寄存器中。 5.17 试编写一个程序,把AX中的十六进制数转换为ASCII码,并将对应的ASCII码依次存放到MEM数组中的四个字节中,例如:当(AX)=2A49H时,程序执行完后,MEM中的4个字节的内容为39H,34H,41H和32H。 5.18 把0~100D之间的30个数存入以GRADE为首地址的30个字数组中,GRADE+i表示学号i+1的学生的成绩。另一个数组RANK为30个学生的名次表,其中RANK+i的内容是学号为i+1的学生的名次。编写一程序,根据GRADE中的学生成绩,将学生名次填入RANK数组中。 5.19 已知数组A包含15个互不相等的整数,试编写一程序,把既在A中又在B中出现的整数存在于数组中C中。 5.20 设在A,B和C单元中存放着三个数,若三个数都不是0,则求出三树之和并存放于D单元中;其中有一个数为0,则把其他两个数也清零。试编写此程序。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值