Cherish♀ang 发表于 2011-6-16 19:17:31

两道作业题,有兴趣的朋友帮忙看下!急急急!!

本帖最后由 Cherish♀ang 于 2011-6-18 18:32 编辑

作业一:
小明今年12岁,小明爸爸今年32岁,试用汇编语言编写程序求多少年后小明爸爸是小明岁数的两倍。
作业二:
用一百块钱买一百只鸡,已知公鸡五块钱一只,母鸡三块钱一只,小鸡一块钱三只。试用汇编语言编写程序求所以可行的买法。


把自己编的第二题的代码发上来了,但我不知道错在哪些地方,各位朋友帮忙看下!!

winddyj 发表于 2011-6-16 22:17:30

呃,不难啊,自己先试着做下呗,哪儿不会,把代码发上来,大家可以帮你,直接求答案有啥意义么

king嗜血法师 发表于 2011-6-16 22:27:29

本帖最后由 king嗜血法师 于 2011-6-16 22:37 编辑

assume cs:exe,ds:data

data segment

db 12
db 32
data ends

exe segment

go: mov ax,data
    mov ds,ax
    xor di,di
    xor bx,bx
    mov dl,ds:
s: mov al,ds:
    xor ah,ah
    div dl               
    inc dl             ;按循环每次小明的年龄加1
    xor ch,ch
    mov cl,ah
    add cx,1      ;这里开始我也搞错了,后来debug才想起来loop跳转是先cx减1,在判断cx是不是为0
    loop s
   
    sub dl,1            ;这时候的dl 是求出的16+1,所以这里要减去1
    mov al,ds:
    sub dl,al            ;16减去小明的初始年龄 dl 的值就16-12获得的值,也就是你要的
   
    mov ax,4c00H
    int 21H
exe ends
end go
第一题做出来了,不过这个只能求到倍数就结束,比如:被除数是60,除数是11,那就求到除数是12就结束了,因为没余数。
第二题那“所以”应该是“所有”吧?不过我现在学的还回答不上来:(

winddyj 发表于 2011-6-16 22:35:38

用了几分钟做了一题,结果会输出到屏幕中间
楼主研究下,自己啃下后一题吧,如果有不会,上来问大家

assume cs:code

code segment
start: mov al,12
      mov bl,32
      mov cx,0200h //cl计算年数,ch做为输出时字体颜色
s:      inc al   //al,bl每循环一次自己加1岁
      inc bl
      inc cx
      mov ah,al//把al值给ah,ah*2与bl比较,相等就输出,不相等继续循环
      add ah,ah
      cmp ah,bl
      jnz s

      mov ax,0b800h //用显卡缓冲区输出cx中的结果
      mov es,ax
      mov bx,1680//屏幕中间显示
      add cx,30h
      mov es:,cx
      mov ax,4c00h
      int 21h
code ends
end start

winddyj 发表于 2011-6-16 22:36:50

唔,忘了说,如果不需要输出结果,只用上半部分就可以了

king嗜血法师 发表于 2011-6-16 22:46:23

果然代码少效果比我的好多了,这样不是两倍会继续循环:dizzy:

小甲鱼 发表于 2011-6-17 00:35:32

嘿嘿……

push      ebp
mov         ebp,esp
sub         esp,44h
push      ebx
push      esi
push      edi
lea         edi,
mov         ecx,11h
mov         eax,0CCCCCCCCh
rep stos    dword ptr

mov         dword ptr ,0

mov         eax,dword ptr
lea         ecx,
mov         edx,dword ptr
add         edx,20h
cmp         ecx,edx
je          main+3Bh

mov         eax,dword ptr
add         eax,1
mov         dword ptr ,eax

jmp         main+1Fh

mov         ecx,dword ptr
push      ecx
push      offset string "%d"
call      printf
add         esp,8

xor         eax,eax

pop         edi
pop         esi
pop         ebx
add         esp,44h
cmp         ebp,esp
call      __chkesp
mov         esp,ebp
pop         ebp
ret





landian008 发表于 2011-6-17 02:16:02

老大你发的代码,我们初学者都看不明白。。。

Cherish♀ang 发表于 2011-6-17 08:56:13

winddyj 发表于 2011-6-16 22:35 static/image/common/back.gif
用了几分钟做了一题,结果会输出到屏幕中间
楼主研究下,自己啃下后一题吧,如果有不会,上来问大家



:loveliness:谢谢~

Cherish♀ang 发表于 2011-6-17 09:00:43

小甲鱼 发表于 2011-6-17 00:35 static/image/common/back.gif
嘿嘿……

老大发的代码,果然与众不同!

Cherish♀ang 发表于 2011-6-17 09:25:52

本帖最后由 Cherish♀ang 于 2011-6-18 18:44 编辑

下面是我自己编的第二题的代码:
datas segment
chick    db 0          ;暂存小鸡
hen      db 0          ;暂存母鸡
cock    db 0          ;暂存公鸡

obuff db "chick 00hen 00cock 00",0ah,0dh,'$'    ;用于输出各种鸡的个数

datas ends

stacks segment
    db 32 dup(0)
stacks ends

code segment
   
start:
      assume cs:codes,ds:datas,ss:stacks
      mov ax,datas
      mov ds,ax
      mov ax,stacks
      mov ss,ax
      
      mov di,offset obuff                ;si,di初始化
      xor si,si

      mov cx,99                           ;设置循环次数
outside:
      inc byte ptr 1               
      mov byte ptr 2,-1      
      
      mov ax,100                           ;设置内循环的循环次数
      sub ax,cx
      push cx
      mov cx,ax
inside:
      inc byte ptr 2
      
      mov bx,0e08h                        ;计算公鸡*14+母鸡*8,存放在al中
      mov al,byte ptr 1      
      mul bl
      mov dl,al
      mov al,byte ptr 2
      mul bh
      add al,dl                              
      
      cmp al,100
      jz ok
      loop inside
      jmp outside2
      
ok:                                                      
;输出这种组合方式
      mov al,100                              ;求小鸡数
      sub al,byte ptr 1
      sub al,byte ptr 2
      mov byte ptr ,al
      
      mov bl,10
      
      xor ah,ah                                 ;将小鸡数目转化成ascii码储存在obuff中的相应位置      
      div bl
      add ax,3030h
      mov word ptr 6,ax
      
      xor ah,ah                                  ;将母鸡数目转化成ascii码储存在obuff中的相应位置
      mov al,byte ptr 1
      div bl
      add ax,3030h
      mov word ptr 14,ax
      
      xor ah,ah                                 ;将公鸡数目转化成ascii码储存在obuff中的相应位置
      mov al,byte ptr 2
      div bl
      add ax,3030h
      mov word ptr 23,ax
      
      mov dx,di
      mov ah,9
      int 21h
      
outside2:      
      pop cx
      loop outside      
      
      mov ax,4c00h
      int 21h
code ends
    end start


可是它运行后的结果是错误的,请各位高手帮忙看下代码。
谢谢~
下面是运行结果截图:

页: [1]
查看完整版本: 两道作业题,有兴趣的朋友帮忙看下!急急急!!