微机原理与汇编语言作业4

1、  mov al,97H
   mov bl, 8AH
   add al,bl
执行上面三条指令后,al中的值是多少?CF、OF、SF、ZF分别是多少?请给出al和bl对应的8个二进制位加法式子。
AL=121H
CF=1
OF=1
SF=0
ZF=0

2、把al中的数以二进制形式显示。(如果al=9,显示00001001。需要用到rol指令和and指令)


 ;AL中的数看作8个二进制位输出显示
    ;8位二进制的形式表示循环8次,每次一个
    ;如果看作16进制位,一次左移四位;看作8进制位一次左移3位,因为3个数字表示一个数
    
    mov al,9
    mov cx,0
    
 again:
    cmp cx,8
    je over
    rol al,1;循环左移8次
    mov bl,al
    and al,00000001b;高位抹零
    mov dl,al
    add dl,48
    mov ah,2
    int 21h
    mov al,bl
    add cx,1
    jmp again 
over:

	;输出结果:00001001

DATAS SEGMENT
a1 db 12,2,113,4,5
a2 word 12,2,113,4,5
srcstring db ‘abcd’
a3 db ‘testtesttest’
DATAS ENDS

EXTRAS SEGMENTKLL
b1 db 1,2,3
deststring db lengthof srcstring dup (?)
b2 db 1,2,3,4,5
EXTRAS ENDS

STACKS SEGMENT

STACKS ENDS

CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS,ES:EXTRAS
START:
MOV AX,DATAS
MOV DS,AX

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

3、 查找a2变量中的最大元素,存放到ax中,调用输出子程序显示。

DATAS SEGMENT
   a1 db 12,2,113,4,5
	a2 word 12,2,113,4,5
   	srcstring db 'abcd'
   	a3 db 'testtesttest'
DATAS ENDS


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

CODES SEGMENT
    ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
    MOV AX,DATAS
    MOV DS,AX
    ;此处输入代码段代码
    
    
    
    mov si,offset a2
    mov cx,0;计数
    mov ax,[si]
  again:   
    cmp cx,4
    je over
 
    add si,2
    cmp ax,[si]
    jb change
    add cx,1
   jmp again
 change:
 	mov ax,[si]
 	add cx,1
 	jmp again
 	
     
   over: 
     call output
     
    
    MOV AH,4CH
    INT 21H
    
    
    
    output proc		;output函数
    				;以ax作为入口参数
    	push bx
    	push cx
    	push dx
    	mov cl,10
    	mov ch,0;计数
    
	divagain:
 	    div cl
 	    push ax
    	add ch,1
    	mov ah,0
    	cmp ax,0
    	je divover
    	jmp divagain
	divover:
		cmp ch,0
		je outputover
		pop bx
		mov dl,bh
		add dl,48
		mov ah,2
		int 21h
		sub ch,1
		jmp divover
	outputover:
		pop dx
		pop cx
		pop bx
 
    ret 
    output endp
    
CODES ENDS
    END START
;输出结果:113

4、查找a2中最大元素的值和该值在a2变量中的对应下标,然后分别显示这个最大值和其下标。

DATAS SEGMENT
   a1 db 12,2,113,4,5
	a2 word 12,2,113,4,541
   	srcstring db 'abcd'
   	a3 db 'testtesttest'
DATAS ENDS


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

CODES SEGMENT
    ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
    MOV AX,DATAS
    MOV DS,AX
    ;此处输入代码段代码
    
    
    
    mov si,offset a2
    mov cx,1;计数
    mov bx,0;判断标志,序号从0开始
    mov ax,[si]
again:   
    cmp cx,lengthof a2
    je over
 
    add si,2
    cmp ax,[si]
    jb change
    add cx,1
   jmp again
change:
 	mov ax,[si]
 	mov bx,cx
 	add cx,1
 	
 	jmp again
 	
     
over: 
     call output
     mov dl,0ah 
     mov ah,02h 
     int 21h
     
     mov ax,bx
     call output
    
    MOV AH,4CH
    INT 21H
    
    
    
    output proc		;output函数
    				;以ax作为入口参数
    	push bx
    	push cx
    	push dx
    	mov cl,10
    	mov ch,0;计数
    
	divagain:
 	    div cl
 	    push ax
    	add ch,1
    	mov ah,0
    	cmp ax,0
    	je divover
    	jmp divagain
	divover:
		cmp ch,0
		je outputover
		pop bx
		mov dl,bh
		add dl,48
		mov ah,2
		int 21h
		sub ch,1
		jmp divover
	outputover:
		pop dx
		pop cx
		pop bx
 
    ret 
    output endp
    
    
   
CODES ENDS
    END START

5、查找a2中最大元素的值和该值在a2变量中的对应下标,然后把a2中的这个最大值和最后一个元素互换位置(即a2中的5个元素变为12,2,4,5,113)。

DATAS SEGMENT
   a1 db 12,2,113,4,5
	a2 word 12,2,113,4,5,7
   	srcstring db 'abcd'
   	a3 db 'testtesttest'
DATAS ENDS


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

CODES SEGMENT
    ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
    MOV AX,DATAS
    MOV DS,AX
    ;此处输入代码段代码
    
    
    
    mov si,offset a2
    mov cx,1;计数
    mov bx,0;判断标志,下标从0开始
    mov ax,[si]
again:   
    cmp cx,lengthof a2
    je over
 
    add si,2
    cmp ax,[si]
    jb change
    add cx,1
   jmp again
change:
 	mov ax,[si]
 	mov bx,cx
 	add cx,1 	
 	jmp again
 	     
over: 
;最大值放在ax中,下标放在bx中

	 mov si,offset srcstring 
    sub si,2
    mov dx,[si]   
    mov [si],ax           
    mov al,bl
    mov cl,2
    mul cl
    
    add ax,offset a2
   
    mov si,ax
    mov [si],dx
    	
	mov cx,0;计数
    mov si,offset a2
  
  aaaaa:
    
    cmp cx,lengthof a2
    je aaaover
    mov ax,[si]			;输出两个字节word
    call output
    mov dl,' '
    mov ah,2
    int 21h
    add si,2
    add cx,1
    jmp aaaaa
    
 aaaover:
     
       
    MOV AH,4CH
    INT 21H
    
    
    
    output proc		;output函数
    				;以ax作为入口参数
    	push bx
    	push cx
    	push dx
    	mov cl,10
    	mov ch,0;计数
    
	divagain:
 	    div cl
 	    push ax
    	add ch,1
    	mov ah,0
    	cmp ax,0
    	je divover
    	jmp divagain
	divover:
		cmp ch,0
		je outputover
		pop bx
		mov dl,bh
		add dl,48
		mov ah,2
		int 21h
		sub ch,1
		jmp divover
	outputover:
		pop dx
		pop cx
		pop bx
 
    ret 
    output endp
    
    
   
CODES ENDS
    END START




  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
编写如下程序,并在机器上调试成功。程序采用菜单式选择,可以接收用户从键盘输入的五个命令(1-5),各命令功能分别为: (1)按下“1”键,完成字符串小写字母变成大写字母。 用户输入一由英文大小写字母或数字0-9组成的字符串(以回车结束),程序逐个检查字符串中各字符,将原串中小写字母变成大写字母,其他字符不变,并在屏幕上显示。用户按任一键,重做,按ESC键,返回主菜单。 (2)按下“2”键,完成找最大值(二选一)。 a.接收用户输入的可显示字符串(以回车结束),程序将其中ASCII码值最大的字符显示出来; b.接收用户输入若干个无符号8位数(以空格或逗号为分隔符,以回车结束),程序将其中最大的数显示出来。用户按任一键,重做,按ESC键,返回主菜单。 (3)按下“3”键,完成排序(二选一)。 a.接收用户输入的可显示字符串,以回车结束。程序按ASCII码值大小由大到小排序并输出显示; b.接收用户输入若干个有符号8位数(以空格或逗号为分隔符,以回车结束),程序将其中最大的数显示出来。用户按任一键,重做,按ESC键,返回主菜单。 (4)按下“4”键,显示时间。 首先提示用户对时,即用户输入时、分、秒(以空格或逗号为分隔符,以回车结束),然后,在屏幕上不断显示时间,格式为: XX(时): XX(分): XX(秒) 最好定点显示。用户按任一键,重新对时,按ESC键,返回主菜单。 (5)按下“5”键,结束程序运行,返回系统提示符。 上述题目代码,之前在网上找到过类似的可总是出问题,编译器出问题,代码运行出问题,这是完全测试过的,应该没有问题

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值