高分悬赏 用汇编语言编写下题的程序

假设孩子6岁开始上学,第一年投入总的费用是1000元,每年增加200元,大学毕业后,这个孩子总共花费多少钱?如果小学期间(小学六年)是按照上面递增规律,而初中、高中是第一年是5000元每年递增200元,大学一年级是8000元,每年递增500元,问最后家长投入多少钱?
虽然程序规范格式化很重要但是因为是一个不太复杂的问题所以还是希望程序能尽量简洁并且通过编译 更多的是想借鉴大家的思路所以思路最好还是多写一点。。学的不太好有的地方看不太懂。。

程序:
.model small
.stack 8192
.data
m1 db 13,10,'Total cost #1 : $'
m2 db 13,10,'Total cost #2 : $'

cost dw 10,12,14,16,18,20 ;第二种算法,小学6年每年年费用(以百元为单位)
dw 50,52,54,56,58,60 ;第二种算法,中学6年每年年费用(百元。我没明白你所谓初高中第一年5000,初一和高一都按5000算还是只有初一是5000,这里假定高一是5600)
dw 80,85,90,95 ;第二种算法,大学4年每年年费用(百元。假定大学毕业是指本科4年后)
years equ ($-cost)/2 ;上学的总年数

.code
main: mov ax,@data
mov ds,ax

;第一种算法,年费是计算出来的
xor ax,ax ;ax总费用
mov bx,10 ;bx初始年费(百元)
mov cx,years ;cx为上学的年数
lp1: add ax,bx ;总费用累加
add bx,2 ;年费逐年增加2(百元)
loop lp1

mov dx,offset m1
call puts
call printax ;至此是第一种算法的结果(数是以100为单位的)
mov dl,'0' ;所以输出时我们人工补上两个0
call putc
call putc

;第二种算法,年费是查表出来的
xor ax,ax ;ax总费用
mov bx,offset cost ;bx指向cost表(表内为第二种算法每年的年费/100)
mov cx,years ;cx为上学的年数
lp2: add ax,[bx] ;总费用累加
add bx,2 ;年费指针移动一个数
loop lp2

mov dx,offset m2
call puts
call printax ;至此是第二种算法的结果(数是以100为单位的)
mov dl,'0' ;所以输出时我们人工补上两个0
call putc
call putc

mov ah,4ch
int 21h

printax proc ;以10进制输出ax中的无符号整数
or ax,ax ;是0则直接输出
jnz @f
push dx
mov dl,'0'
call putc
pop dx
ret
@@: push ax
push cx
push dx
push bx
mov bx,10
xor dx,dx
div bx
mov cx,ax
or cx,dx ;若商与余数都为0则结束递归
jz @f
push dx ;留存DX中的余数以在递归后输出
call @b ;递归
pop dx ;从最高位开始恢复余数
add dl,'0'
call putc
@@: pop bx
pop dx
pop cx
pop ax
ret
printax endp

putc proc ;输出DL里的字符
push ax
mov ah,2
int 21h
pop ax
ret
putc endp

puts proc ;输出DS:DX指向的字串
push ax
mov ah,9
int 21h
pop ax
ret
puts endp

end main

结果:
Total cost #1 : 40000
Total cost #2 : 77000

第一种算法:总费用40000元
第二种算法:总费用77000元
温馨提示:内容为网友见解,仅供参考
第1个回答  2010-11-29
;假设孩子6岁开始上学,第一年投入总的费用是1000元,每年增加200元,大学毕业后,这个孩子总共花费多少钱?如果小学期间(小学六年)

是按照上面递增规律,而初中、高中是第一年是5000元每年递增200元,大学一年级是8000元,每年递增500元,问最后家长投入多少钱?

;用MASM5.0编译通过,以下是运行实例

;E:\masm1>1129
;
;First : 40000
;Second : 77000
;E:\masm1>
;

data segment

Y6 DW 1000
Y6_A DW 200

CG DW 5000
CG_A DW 200

D DW 8000
D_A DW 500

DB 'HHHHHHHHHHHHH'

SUMXX DW 0
SUMXX1 DW 0
SUMCG DW 0
SUMCG1 DW 0
SUMDX DW 0
SUMDX1 DW 0

SUM1 DW 0
SUM1_1 DW 0
SUM2 DW 0
SUM2_1 DW 0
DB 'HHHHHHHHHHHHH'
CRLF DB 0dh,0ah,'$'
s1 db 0dh,0ah,'First : $'
s2 db 0dh,0ah,'Second : $'

DB 'HHHHHHHHHH'

data ends
code segment
assume cs:code, ds:data
main proc far
start:
push ds
xor ax,ax
push ax
mov ax,data
mov ds,ax
;-------------------------
START_1:

;--------------- 第一种情况: 从小学到大学,共6+6+4=16(年)
MOV AX,Y6 ;基数:小学 1000*16年
MOV CX,16
MUL CX
PUSH AX
PUSH DX
MOV CX,16-1 ;递增:16年
mov dx,0
MOV AX,0
LOOP_16:
ADD AX,Y6_A ;每年的递增值
add dx,ax ;每年递增值之和
LOOP LOOP_16
mov ax,dx
POP DX
POP BX
ADD AX,BX
ADC DX,0 ;基数+递增
MOV BX,OFFSET SUM1 ;保存16年费用
MOV [BX],AX
ADD BX,2
MOV [BX],DX

MOV AH,09
MOV DX,OFFSET S1
INT 21H
MOV BX,OFFSET SUM1
MOV AX,[BX]
ADD BX,2
MOV DX,[BX]
CALL HTOD

;RET

MOV AH,09
MOV DX,OFFSET S2
INT 21H

;--------------- 第2种情况: 从小学到大学分段共16(年)
MOV AX,Y6 ;基数:小学 1000*6年
MOV CX,6
MUL CX
PUSH AX
PUSH DX
MOV CX,6-1 ;递增:小学6年
mov dx,0
MOV AX,0
LOOP_XX:
ADD AX,Y6_A ;递增值
add dx,ax ;每年递增值之和
LOOP LOOP_XX
mov ax,dx
POP DX
POP BX
ADD AX,BX
ADC DX,0 ;基数+递增
MOV BX,OFFSET SUMXX ;保存小学费用
MOV [BX],AX
ADD BX,2
MOV [BX],DX

MOV AX,CG ;基数:初高中 5000*6年
MOV CX,6
MUL CX
PUSH AX
PUSH DX
MOV CX,6-1 ;递增:初高中6年
mov dx,0
MOV AX,0
LOOP_CG:
ADD AX,CG_A ;递增值
add dx,ax ;每年递增值之和
LOOP LOOP_CG
mov ax,dx
POP DX
POP BX
ADD AX,BX
ADC DX,0 ;基数+递增
MOV BX,OFFSET SUMCG ;保存初高中费用
MOV [BX],AX
ADD BX,2
MOV [BX],DX

ADD AX,SUMXX ;小学\初中\高中汇总
ADC DX,0
ADD DX,SUMXX1
MOV SUM2,AX
MOV SUM2_1,DX

MOV AX,D ;基数:大学 8000*4年
MOV CX,4
MUL CX
PUSH AX
PUSH DX
MOV CX,4-1 ;递增:大学4年
mov dx,0
MOV AX,0
LOOP_DX:
ADD AX,D_A ;递增值
add dx,ax ;每年递增值之和
LOOP LOOP_DX
mov ax,dx
POP DX
POP BX
ADD AX,BX
ADC DX,0 ;基数+递增
MOV BX,OFFSET SUMDX ;保存初高中费用
MOV [BX],AX
ADD BX,2
MOV [BX],DX

ADD AX,SUM2
ADC DX,0
ADD DX,SUM2_1
CALL HTOD

ret
main endp
;==================
HTOD PROC NEAR
;入口 DX:AX 32位数,值<99999
;出口:以10进制输出该值
MOV CX,10000
DIV CX
PUSH DX ;保存余数
ADD AL,30H
MOV DL,AL
MOV AH,02
INT 21H

POP AX ;取余数
MOV DX,0
MOV CX,1000
DIV CX
PUSH DX ;保存余数
ADD AL,30H
MOV DL,AL
MOV AH,02
INT 21H

POP AX ;取余数
MOV DX,0
MOV CX,100
DIV CX
PUSH DX ;保存余数
ADD AL,30H
MOV DL,AL
MOV AH,02
INT 21H

POP AX ;取余数
MOV DX,0
MOV CX,10
DIV CX
PUSH DX ;保存余数
ADD AL,30H
MOV DL,AL
MOV AH,02
INT 21H

POP DX ;取余数
ADD DL,30H
MOV AH,2
INT 21H

RET

HTOD ENDP
;==================

code ends
end start
第2个回答  2010-11-29
四个等差数列(以100为单位)
a0=10,d=2,n=6
a0=50,d=2,n=3
a0=50,d=2,n=3
a0=80,d=5,n=4

code segment
assum cs:code
begin:
seq1:
mov al,10
mov bl,2
mov cl,6
call sumseq
mov dx,ax
seq2:
mov al,50
mov bl,2
mov cl,3
call sumseq
add dx,ax
seq3:
mov al,50
mov bl,2
mov cl,3
call sumseq
add dx,ax
seq4:
mov al,80
mov bl,5
mov cl,4
call sumseq
add dx,ax
;DX*100即为所求
;结果应该是75200
mov ax,4c00h
int 21h
;功能:求等差数列的钱N项和
;入口参数AL=a0,BL=d,CL=n
;返回值AX=Sn
sumseq pro
push bx
push cx
push dx
mul cl
mov dx,ax
mov al,cl
dec al
mul cl
mul bl
sar ax,1
add ax,dx
pop dx
pop cx
pop bx
sumseq endp

code ends
end begin本回答被提问者采纳
第3个回答  2010-11-29
好多好多钱~~

唉~~命苦啊!!!

高分悬赏,汇编语言高手进
1. 用DEBUG编写程序,在屏幕上显示一个字符串HELLO!,并以A.COM为文件名存盘 复制下面的文本内容,粘贴于记事本(注意:不要删除中间的空行),保存为A.TXT,然后在DOS提示符下输入:DEBUG <A.TXT,Ok。e10d 'HELLO!$'a100 lea dx,[10d]mov ah,9 int 21 mov ax,4c00 int 21 rbx 0 rcx ...

高分悬赏(可追加):C51单片机24CX的读写汇编程序
把RAM 43H-4ah 写入 AT24C1024 的 10000-10007单元中 并从AT24C1024 读出到 51RAM 的 60h-67h中 并将 60h 输出的P2口 ProteUS调试通过!原理图和你的一样!b_SCK EQU P3.6 b_SDA EQU P3.7 c_ADD_P EQU 30H c_ADD_NUM EQU 31H c_ADD_U EQU 40H c_ADD_H EQU 41H ...

高分求一汇编小程序,
INT 16H ;查询键盘 CMP AX,1C0DH ;看右enter键是否被按下 JNE lp ;若没有按下,则跳回lp ;mov ax, prog_len ;---结束并驻留内存--- mov ax,3100h mov dx,((prog_len + 15)\/16) ;驻留区,16的整数倍 int 21h mov ax,4c00h int 21h main endp ;--- showtime pro...

C语言编写一个程序,急用!!高分悬赏(正确答案追加分数)
printf("===十道题目回答如下===\\n\\n");for(int j = 0; j < 10; j++){ printf("%d + %d = %d\\t", plu[j][0], plu[j][1], plu[j][2]);if(plu[j][2] != plu[j][3])printf("(正确答案为%d)", plu[j][3]);printf("\\n");} printf("输入任意键返回主菜单\\...

高分悬赏!关于汇编语言的一些问题!
1 assume cs:code, ds:datas datas segment var db 100, 77, 69, 201, 32, 148 answer db 0 datas ends code segment start:mov bx, datas mov ds, bx mov cx, 6 mov bx, offset var xor ax, ax mov si, 0 next:add al, [bx+si]inc si loop next mov [answer], al mov ...

高分悬赏软件问题:想要编写个自动出题软件能够从自带的题库里选题需要...
Visual Basic 吧,这个编程语言简单一些,上手快。如果你只是一个小程序,也就是题库量并不是很大,界面要求不是很好的话,可以用Office Excel 编一个也行。如果题库量很大,可就要用到数据库,例如SQL Server、Access等等,VB是可以访问使用以上数据库的。说白了,你选一种编程语言学习一下,键接...

高分悬赏!求代码帝编一个这样的程序,关于网络截包发包方面的!完全能...
典型的外挂。首先,WPE发的包是加密的,你如果要用编程工具实现,例如C++、C#、VB之类,必须用OD断点游戏中包的情况,以汇编代码或十六进制形式发送,在编程语言中,比如C#或者C++,都是无法直接用你WPE截取到的封包进行发送的,曾经我做这个的时候,和一个朋友一直研究很久,发现WPE是有自己写的DLL类型...

分油问题与编程C++,,高分悬赏 要有解释 详细点
第一个题:include <iostream> using namespace std;class Bottle\/\/3个瓶子类 { private:int a; \/\/a---10L的瓶子 int b; \/\/b---7L的瓶子 int c; \/\/c---3L的瓶子 public:Bottle(){ } Bottle(int x,int y,int z){ a = x;b = y;c = z;} \/\/下面是6个倒油的函数 void ...

【高分悬赏~~~】请阐述自己对“媒介化×数字化”生存的认识。
【高分悬赏~~~】请阐述自己对“媒介化×数字化”生存的认识。 有米有高端人士能向我解释一下这个题呢~??【请阐述自己对“媒介化×数字化”生存的认识。】500字左右的阐述~~~... 有米有高端人士能向我解释一下这个题呢~??【请阐述自己对“媒介化×数字化”生存的认识。】500字左右的阐述~~~ 展开  ...

...高分悬赏 限时速来 用汇编语言 不能用C语言 谢谢
YELLOW_EW EQU P3.4 GREEN_EW EQU P3.5 ORG 0000H LJMP MAIN ORG 000BH LJMP T0ISR ORG 0030H MAIN:MOV TMOD,#01H MOV TH0,#HIGH(65536-50000)MOV TL0,#LOW(65536-50000)SETB TR0 SETB ET0 SETB EA SETB GREEN_EW SETB RED_NS CLR RED_EW CLR GREEN_NS CLR YELLOW_EW CLR ...

相似回答
大家正在搜