1.?求阶?׳˵Ļ??Դ??
2.用汇编语言设计程序实现10!(10的阶乘)
3.用汇编编写5的阶乘的程序
4.有汇编大神吗?帮忙写一下100的阶乘的程序
??׳˵Ļ??Դ??
楼主给出的程序,有不少错误。汇编汇编聚合源码网改正如下:
DATA SEGMENTCN DW 3
RES DW ?源码源码犯罪
DATA ENDS
STACK SEGMENT
DB DUP(?) ;定义字节的空间
STACK ENDS
CODE SEGMENT
ASSUME CS:CODE, DS:DATA, SS:STACK
START PROC FAR ;定义远过程
PUSH DS
MOV AX, 0
PUSH AX
MOV AX, DATA
MOV DS, AX
MOV AX, STACK
MOV SS, AX
MOV BX, CN
MOV AX, BX
CALL FACTOR
MOV RES, AX
RET
START ENDP
FACTOR PROC
CMP BX, 1
JE M0
DEC BX
PUSH BX
CALL FACTOR ;原程序在这里有错
POP BX
MUL BX
M0: RET
FACTOR ENDP
CODE ENDS
END START
楼主的其它问题,都是阶乘nage源码选项,可有可无的求阶easymesh源码。
用汇编语言设计程序实现!(的汇编汇编cvcolor源码阶乘)
.
.model flat,stdcall
option casemap:none
include windows.inc
include kernel.inc
includelib kernel.lib
.data
dwNum dd ?
.code
start:
mov eax,
mov ebx,9
.repeat
mul ebx
sub ebx,1
.until ebx ==1
mov dwNum,eax
invoke ExitProcess,0
end start
用汇编编写5的阶乘的程序
;汇编语言实现计算SUM=5!
DATAS SEGMENT
;此处输入数据段代码
NUM DW 5 ;最高阶数
SUN DW 0 ;计算结果
DATAS ENDS
STACKS SEGMENT
;此处输入堆栈段代码
STACKS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
MOV AX,DATAS
MOV DS,AX
;此处输入代码段代码
MOV CX,NUM
MOV AX,1 ;被乘数
MOV SI,1 ;乘数
L1:
MUL SI ;(dx,ax)保存n!,n表示第n次循环
INC SI
LOOP L1
MOV SUM,源码AX
MOV AH,4CH
INT H
CODES ENDS
END START
有汇编大神吗?帮忙写一下的阶乘的程序
; 汇编语言
; !=
;
;
;
; 阶乘!的结果是位十进制数
;数据段
data segment
N EQU ;阶乘 N!
MAX EQU ;允许阶乘结果的最大位数(十进制数)
RESULT DB MAX DUP (0),'$' ;存放阶乘的结果
TEMP DB MAX DUP (0) ;用于运算的临时缓存
N_STR DB '!','=',0DH,0AH,'$'
data ends
;代码段
code segment
assume cs:code,ds:data
start:
mov ax,data
mov ds,ax
mov cx,N ;主计数器,N阶乘
;================转换数据N为非压缩BCD,存入RESULT 开始
jcxz FACT_EXIT
lea bx,RESULT+MAX ;bx指向RESULT末尾字节之后
mov ax,cx
mov di,
BCD_NEXT:
mov dx,0
div di ;每次都除以
dec bx
mov [bx],dl ;将余数(非压缩BCD)存入RESULT
cmp ax,0
jne BCD_NEXT
;================转换数据N为非压缩BCD,存入RESULT 结束
lea si,RESULT+MAX
sub si,bx ;si记录BCD串的总长度
;================主运算代码 开始
OUTER_LOOP: ;外循环LOOP
dec cx
cmp cx,1
jle FACT_EXIT
push cx ;保护外循环的计数器cx
;================将RESULT数据拷贝给TEMP缓存 开始
mov dx,si
lea bx,RESULT+MAX ;bx指向RESULT末尾字节之后
lea di,TEMP+MAX ;di指向TEMP末尾字节之后
COPY_LOOP:
dec bx
dec di
mov al,[bx]
mov [di],al
dec dx
jnz COPY_LOOP
;================将RESULT数据拷贝给TEMP缓存 结束
dec cx
cmp cx,0
jle FACT_EXIT
INNER_LOOP: ;内循环LOOP
push cx ;保护内循环的计数器cx
;================用加法代替乘法 开始
lea bx,RESULT+MAX ;bx指向RESULT末尾字节之后
lea di,TEMP+MAX ;di指向TEMP末尾字节之后
mov cx,si
clc ;进位标志清零CF=0
ADC_LOOP: ;"带进位加法"循环
dec di
dec bx
mov al,[di] ;提取TEMP临时字节
mov ah,[bx] ;提取RESULT字节
adc al,ah ;ADC是"带进位加法"
cmp al,9
jna NOT_CARRY
sub al, ;保证非压缩BCD的范围是0到9
stc ;有进位,CF=1
jmp ADC_GO
NOT_CARRY:
clc ;没有进位,CF=0
ADC_GO:
mov [bx],al ;保存加法的结果(非压缩BCD)
loop ADC_LOOP
jnc OK_NEXT ;JNC是检查整个BCD串相加后,最后是否有进位
inc si
dec bx
mov byte ptr [bx],1 ;RESULT保存进位CF
OK_NEXT:
;================用加法代替乘法 结束
pop cx
loop INNER_LOOP ;内循环LOOP
pop cx
jmp OUTER_LOOP ;外循环LOOP
;================主运算代码 结束
FACT_EXIT:
;================屏幕显示阶乘的结果 开始
mov ax,N
call SHOW_DEC ;子程序,显示数字N
lea dx,N_STR
mov ah,9
int H ;H中断的9号功能负责在屏幕显示字符串
mov cx,si
lea bx,RESULT+MAX
TO_ASCII:
dec bx
add byte ptr [bx],H ;将阶乘的结果转换为ASCII
loop TO_ASCII
mov dx,bx
mov ah,9
int H
;================屏幕显示阶乘的结果 结束
mov ax,4cH
int H
;================子程序 开始
SHOW_DEC PROC ;子程序,将位数转换为ASCII串,在屏幕显示
push cx ;子程序的输入参数是ax
push dx
push di
mov di, ;DIV指令的除数
mov cx,0 ;计数器,累计十进制数有多少位数
DIV_NEXT:
mov dx,0 ;被除数(dx:ax),只需要ax的位,将dx设为0
div di ;除法公式: (dx:ax)/di 得到 商数ax,余数dx
push dx ;用堆栈暂存获得的余数
inc cx
cmp ax,0 ;如果除法之后,商数是0,说明已经算完十进制数每位的值,
jnz DIV_NEXT ;则退出循环,如果商数不是0,则继续作除法.
CHAR_NEXT: ;十进制数有多少位数就循环多少次
pop dx
add dl,H ;转换为ASCII
mov ah,2
int H ;H中断的2号功能负责在屏幕显示1个字符
loop CHAR_NEXT
pop di
pop dx
pop cx
ret
SHOW_DEC ENDP
;================子程序 结束
code ends
end start