level 1
.model small.stack.datasum dw ?.code.startupmov cx,100call sumamov sum,axsuma procpush ax (是否要保护 AX,BX)push bxxor ax,axmov ax,1again: add bx,axinc axloop againretsuma endpend
2005年10月21日 09点10分
1
level 0
你的问题是什么,是要让它正常运行吗?你的程序是可以运行的啊!不过会把suma运行两次。你把suma放在前面吧。push ax push bx 不要也行的
2005年10月21日 09点10分
4
level 4
这个程序不是你写的是吧,你是想别人给你解释一下是怎么求sum=1+.....+n的是吗?
2005年10月21日 12点10分
6
level 4
如果你是那个意思的话,mov cx,100 就是把循环次数放在cx里,共100此,每次循环后会自动减1循环结束条件是cx为0,共循环100此,每次都是用ax里的值去加上bx的值,而ax的值每次都自动加1,所以就是1+2........+100了。
2005年10月21日 12点10分
7
level 0
不是的 ,这是我的作业 是我写的 题目是求sum=1+.......+n,但是我不知道 怎么汇编, 就把CX 设置成 100 好算点 望 无敌汇编大侠帮我 改正下 到底因该怎么编!!谢谢您
2005年10月22日 00点10分
8
level 4
你是说n的值是不定的,加入n的值不定,程序无法运行。不过你可以通过键盘把n从屏幕上传进去,但比较麻烦,首先要ascII码换成10进制数。如果你有兴趣这样作的话,可以看我这里。;本函数将键盘接受的数据转换成16进制代码存入bx中. recv proc near mov bx,0 newchar: mov ah,1; int 21h; sub al,30h; jl exit; cmp al,9d; jg exit; cbw; xchg ax,bx; mov cx,10d; mul cx; xchg ax,bx; add bx,ax; jmp newchar; exit: call crlf ;每次接收完后回车换行; ret; recv endp; 你把bx中的值mov到cx中就行了,这样n的值由你运行是决定。
2005年10月22日 00点10分
10
level 1
汇编大哥我上机调试了 错误N多啊!1调试了一上午了刚学真有点难啊!! 能把完整程序在写出来我对照下我把 mov cx,BXcall recvcall suma mov sum,a AX 和BX CX 要不要保护 您用了MOV AH,1 要PUSH AX 和BX 和CX吧
2005年10月22日 04点10分
11
level 2
如果你不需要从键盘输入n,那么代码如下:.MODELSMALL.8086;************************************* 堆栈段 *****************************************.STACK256;************************************* 数据段 *****************************************.DATASUMWORD?;;************************************* 代码段 *****************************************.CODESTART:;程序初始化MOVAX, @DATA;MOVDS, AX;MOVES, AX;;代码处:;-------------------------------------------------MOVCX, 100;装入n值CALLSUMR;调用函数,求数列;-------------------------------------------------;返回DOSEND0:MOVAH, 4CH;INT21H;;求N的函数SUMRPROCNEAR;*****************************************************;CX: 入口参数,用于确定n值;AX: 用于累加1 + 2 + 3... +N的值;SUM: 存放累加后的AX;*****************************************************PUSHF;保护状态位PUSHAX;保护AXXORAX, AX;清空AX, 用于累计SUM值ADDRS:ADDAX, CX;每次用AX的当前值加上CX当前值LOOPADDRS;CX减1, 继续循环MOVSUM, AX;将AX值存入SUMPOPAX;恢复AXPOPF;恢复状态位RET;SUMRENDP;************************************** 程序结束 *********************************************ENDSTART其实基本算法就是: XORAX, AX;ADDRS: ADDAX, CX; LOOPADDRS;
2005年10月22日 05点10分
12
level 0
;************************************* 堆栈段 *****************************************这些是什么?想哭 其他都能看懂;************************************** 程序结束 *********************************************
2005年10月22日 06点10分
13
level 4
以下好像只能在emu8086上可以显示出答案。思考中...data segmentsum dw ?data ends;code segmentassume cs:code,ds:data;;在bx中存入键盘输入的十进制数字。recv proc near mov bx,0 newchar: mov ah,1; int 21h; sub al,30h; jl exit; cmp al,9d; jg exit; cbw; xchg ax,bx; mov cx,10d; mul cx; xchg ax,bx; add bx,ax; jmp newchar; exit: ret; recv endp; ;进行累加运算;suma proc xor ax,ax xor bx,bx mov ax,1 again: add bx,ax inc ax loop again ret suma endp ;将结果用16进制在屏幕显示。printr proc mov ch ,4 ;ch中表示4个字符; rotate: mov cl,4 ;在cl中保存4,每次右移四位. rol bx,cl; ;右移. mov al,bl ;将bx的低四位放进al,用于显示. and al,0fh ; add al,30h ;0-9二进志转换成16进制后要
加3
0h换成asII码的符号. cmp al,3ah ;3ah表示大于9,就是39h jl print add al,7h ;不是0-9要在加上7h print: mov dl,al ;dl中存放将要被显示的字符; mov ah,2 ;ah中放具体功能. int 21h dec ch ;将ch中的值减一,表示完成一个字符显示. jnz rotate ;符号标志位不为0,跳转. ret printr endp main: mov ax,data; mov ds,ax; call recv; mov cx,bx; 相当于把n的值放进cx中。传递参数; call suma mov sum,bx ;把结果放进变量sum中; call printr; code ends; end main;
2005年10月22日 07点10分
16
level 1
问题就是要 N 就是说 随便输入一个N直 就能求出SUM 的结果;
2005年10月22日 07点10分
17
level 1
无敌汇编GG 出来帮小弟弄下,我叫我们帮的都加您的 吧 您做我们老师算了
2005年10月22日 07点10分
18
level 4
我在emu8086上面试过了,上面的程序可以运行,并随便输入一个数都行,都可以计算出答案并显示出来,只要不溢出。可是在dos下面有点问题,不能在屏幕上显示答案。
2005年10月22日 07点10分
19
level 2
你在DOS下运行,不加返回代码怎么返回???加上code ends(用大写写的)上的两句就可以了.data segment sum dw ? data ends; code segment assume cs:code,ds:data; ;在bx中存入键盘输入的十进制数字。 recv proc near mov bx,0 newchar: mov ah,1; int 21h; sub al,30h; jl exit; cmp al,9d; jg exit; cbw; xchg ax,bx; mov cx,10d; mul cx; xchg ax,bx; add bx,ax; jmp newchar; exit: ret; recv endp; ;进行累加运算; suma proc xor ax,ax xor bx,bx mov ax,1 again: add bx,ax inc ax loop again ret suma endp ;将结果用16进制在屏幕显示。 printr proc mov ch ,4 ;ch中表示4个字符; rotate: mov cl,4 ;在cl中保存4,每次右移四位. rol bx,cl; ;右移. mov al,bl ;将bx的低四位放进al,用于显示. and al,0fh ; add al,30h ;0-9二进志转换成16进制后要加30h换成asII码的符号. cmp al,3ah ;3ah表示大于9,就是39h jl print add al,7h ;不是0-9要在加上7h print: mov dl,al ;dl中存放将要被显示的字符; mov ah,2 ;ah中放具体功能. int 21h dec ch ;将ch中的值减一,表示完成一个字符显示. jnz rotate ;符号标志位不为0,跳转. ret printr endp main: mov ax,data; mov ds,ax; call recv; mov cx,bx; 相当于把n的值放进cx中。传递参数; call suma mov sum,bx ;把结果放进变量sum中; call printr; MOVAH, 4CH; INT21H; code ends; end main;
2005年10月22日 08点10分
20