汇编语言:从键盘输入数字字符,(计算阶乘),以无符号十进制形式输出(分支、循环程序)

1.分支结构原理

分支结构是汇编语言中的一种基本控制结构,它允许程序根据条件选择执行不同的路径。分支结构通常通过跳转(jump)指令来实现。

条件判断:

汇编语言中的条件判断通常通过比较(compare)指令来实现。比较指令将两个操作数进行比较,并根据比较结果设置状态标志(如零标志ZF、符号标志SF等)。

状态标志随后被用于控制跳转指令的行为。

跳转指令

跳转指令根据当前的状态标志来决定是否跳转以及跳转到哪里。

常见的跳转指令包括无条件跳转(如JMP)和条件跳转(如JE、JNE、JG、JL等)。

条件跳转指令根据特定的条件(如相等、不相等、大于、小于等)来决定是否执行跳转。

2.循环结构原理

循环结构是汇编语言中另一种基本控制结构,它允许程序重复执行一段代码直到满足某个条件为止。循环结构通常通过循环指令和跳转指令来实现。

循环初始化

在循环开始之前,需要初始化循环计数器(通常是一个寄存器)和循环条件。

循环体

循环体是包含要重复执行的指令的代码块。

循环更新

在每次循环迭代结束时,需要更新循环计数器。

循环条件判断

在每次循环迭代开始时,需要判断循环条件是否满足。如果满足,则继续执行循环体;如果不满足,则退出循环。

循环指令

汇编语言中可以使用LOOP指令来实现简单的循环结构。LOOP指令会自动递减循环计数器,并在计数器不为零时跳回到循环体的开始。

也可以使用其他跳转指令(如JMP)和条件判断指令来实现更复杂的循环结构。

1、编写程序,编写程序,从键盘输入数字字符(如'1''2''6''a'),在程序中得到对应的数值(126),在以无符号十进制形式输出,将得到的数值输出显示。

注:乘法用的8位的BL,所以输入的数字字符最多有4位,并且前三位不能大于255

INPUTDISPLAY PROC
	PUSH AX
	PUSH BX
	PUSH CX
	PUSH DX
	MOV BL,10
    MOV DX,0
L1: 
    MOV AH,1
    INT 21H
    CMP AL,'9';输入不是数字字符跳出死循环
    JA L2
    CMP AL,'0'
    JB L2
    
    SUB AL,48
    MOV AH,0
    MOV CL,AL
    MOV CH,0
    MOV AL,DL
    MUL BL			;乘法结果不能大于255,除最后一次
    				; 所以最多只能存4位且前3位不能大于255
    ADD AX,CX		;cx放输入的数
    MOV DX,AX		;dx放结果
    
    JMP L1    ;死循环
    
L2:;将AX中的数以无符号十进制形式输出显示。
    MOV AX,DX		;最大2559
    MOV CX,SP		;用于最后判断入栈的是否出完
    
L3: 	;循环压栈(所有)
    DIV BL		;不能是DIV BX显示DIV ERROR
    PUSH AX		;PUSH AH错误
    MOV AH,0	;余数清0
    
    CMP AL,0;商大于0继续循环
    JA L3
    
       
 L4:   ;循环输出
    POP DX
    MOV DL,DH
    ADD DL,48
    MOV AH,2
    INT 21H
    
    CMP SP,CX;栈空停止
    JNE L4
    	
    POP DX
    POP CX
    POP BX
    POP AX 	
INPUTDISPLAY ENDP

2、从键盘输入1个数字字符(例如'5'),在程序中得到对应的数值的阶乘(5!),然后在利用1中的输出功能,将得到的数值输出显示。

注:1、同样由于寄存器有限位数,只能计算1-6的阶乘

2、由于最后输出判断用到sp与0的比较,所以用于函数需要变一下

    MOV BL,10;用于除法
    MOV DX,0;用于显示
    MOV CX,0;用于计算阶乘

    MOV AH,1
    INT 21H
    SUB AL,48
    MOV AH,0
    MOV CX,AX
    
L1:        ;计算阶乘结果在AX CX放需要乘的每一个数
	CMP CX,1;先判断防止输入1
	JBE L2	
    SUB CX,1
    MUL CX	;6!乘到2时大于255 不能只用8位寄存器  
    JMP L1  
    

 L2: 	;循环压栈(所有)
    DIV BL
    PUSH AX
    MOV AH,0   
    CMP AL,0;商大于0继续循环
    JA L2   
    
 L3:   ;循环输出
    POP DX
    MOV DL,DH
    ADD DL,48
    MOV AH,2
    INT 21H    
    CMP SP,0;栈空停止
    JNE L3