鱼C论坛

 找回密码
 立即注册
查看: 2558|回复: 13

汇编语言实验十第1、2题答案

[复制链接]
发表于 2012-8-12 07:23:13 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 s0512 于 2013-5-25 15:32 编辑

我做出来了,但感觉效率似乎不高,所以找答案,甲鱼哥的站貌似没有实验十的答案,,因此求助广大鱼油~~{:1_1:}
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2012-8-12 10:53:24 | 显示全部楼层
本帖最后由 lukelqz 于 2012-8-12 10:54 编辑

第一题:我的代码,也没怎么优化,随便写的。
  1. ;名称:show_str
  2. ;功能:在指定的位置,用指定的颜色,显示一个用0结束的字符串
  3. ;参数:(dh)=行号(取值范围0-24),(dl)=列号(取值范围0-79)
  4. ;    (cl)=颜色,ds:si指向字符串的首地址
  5. ;返回: 无

  6. show_str:
  7.                 push es
  8.                 push ax
  9.                 push bx
  10.                 push cx
  11.                 push dx
  12.                 push si
  13.                 push di
  14.                
  15.                
  16.                 mov ax,0b800h
  17.                 mov es,ax
  18.                 mov si,0
  19.                 mov al,0a0h
  20.                 mov ah,0
  21.                 mul dh
  22.                 mov bx,ax
  23.                 add dl,dl
  24.                 mov dh,0
  25.                 add bx,dx
  26.                 mov di,0
  27.                 mov ah,cl
  28. str0:        mov cl,[si]
  29.                 mov ch,0
  30.                 jcxz ok
  31.                 mov al,cl
  32.                 mov es:[bx+di],ax
  33.                 inc si
  34.                 add di,2
  35.                 jmp short str0


  36. ok:        pop di
  37.                 pop si
  38.                 pop dx
  39.                 pop cx
  40.                 pop bx
  41.                 pop ax
  42.                 pop es
  43.                 ret
复制代码
第二题:
  1. ;名称:divdw
  2. ;功能:进行不会产生溢出的除非运算,被除数为dword型,除数为word型,结果为dword型
  3. ;参数:(ax)=dword型数据的低16位
  4. ;          (dx)=dword型数据的高16位
  5. ;          (cx)=除数
  6. ;返回:(dx)=结果的高16位,(ax)=结果的低16位
  7. ;          (cx)=余数
  8. divdw:        push si
  9.                 push ax
  10.                 mov ax,dx
  11.                 mov dx,0
  12.                 div cx
  13.                 mov si,ax
  14.                 pop ax
  15.                 div cx
  16.                 mov cx,dx
  17.                 mov dx,si
  18.                 pop si
  19.                 ret
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
 楼主| 发表于 2012-8-12 18:14:42 | 显示全部楼层
本帖最后由 张国祥 于 2012-8-13 00:08 编辑

@lukelqz,这个@ 管用不……,,我想问一下,你的第二题,,是按照书上提供的公式来算的吗?
小甲鱼最新课程 -> https://ilovefishc.com
 楼主| 发表于 2012-8-12 18:17:25 | 显示全部楼层
lukelqz 发表于 2012-8-12 10:53
第一题:我的代码,也没怎么优化,随便写的。 第二题:

我的第一题:
  1. show_str:
  2.                 mov ax,0b800h
  3.                 mov es,ax
  4.                 mov bl,cl
  5.                 call adress
  6.         s:       
  7.                 xor ch,ch
  8.                 mov cl,[si]
  9.                 jcxz ok
  10.                 mov al,[si]
  11.                 mov ah,bl
  12.                 mov es:[di],ax
  13.                 add di,2
  14.                 inc si
  15.                 jmp short s
  16.                
  17.         adress:
  18.                 xor ah,ah
  19.                 mov al,160
  20.                 dec dh
  21.                 mul byte ptr dh
  22.                 mov di,ax
  23.                 xor ah,ah
  24.                 mov al,2
  25.                 dec dl
  26.                 mul byte ptr dl
  27.                 add di,ax
  28.                 ret

  29.         ok: ret
复制代码


小甲鱼最新课程 -> https://ilovefishc.com
 楼主| 发表于 2012-8-13 00:09:59 | 显示全部楼层
lukelqz 发表于 2012-8-12 10:53
第一题:我的代码,也没怎么优化,随便写的。 第二题:

原公式:X/N=int(H/N)*65536+[rem(H/N)*65536+L]/N

65536=10000H,无法用一个寄存器存下他,我就想到256*256=65536,所以连乘两次即可。

当时想问题时感觉即使使用栈也有困难,要存储的数据超过4个,寄存器出入栈顺序分配不过来,于是先从后半部分([rem(H/N)*65536+L]/N)下手,这样寄存器够了,出入栈顺序也妥当,,问题最终解决了,,but,看到答案后,,我震惊了,,,,完全不需要我这么麻烦,,,问题似乎在于你们忽略了65536的存在……

我的源码:
  1.         divdw:
  2.                 push ax
  3.                 mov ax,dx
  4.                 xor dx,dx
  5.                 div cx
  6.                 pop bx
  7.                 push ax
  8.                 push bx
  9.                 mov ax,dx
  10.                 mov bx,256
  11.                 mul word ptr bx
  12.                 mul word ptr bx
  13.                 pop bx
  14.                 add ax,bx
  15.                 div cx
  16.                 mov cx,dx
  17.                 pop dx
  18.                 push ax
  19.                 mov ax,dx
  20.                 mov bx,256
  21.                 mul word ptr bx
  22.                 mul word ptr bx
  23.                 pop bx
  24.                 add ax,bx
  25.                 ret
复制代码

小甲鱼最新课程 -> https://ilovefishc.com
发表于 2012-8-13 09:24:27 | 显示全部楼层
张国祥 发表于 2012-8-13 00:09
原公式:X/N=int(H/N)*65536+[rem(H/N)*65536+L]/N

65536=10000H,无法用一个寄存器存下他,我就想到2 ...

10000H就是左移4位啊。呵呵。这题有技巧的。我开始做的也很麻烦。不过小甲鱼的视频中有提示的。
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2012-8-13 09:27:59 | 显示全部楼层
张国祥 发表于 2012-8-12 18:17
我的第一题:

建议你把子程序中用到的寄存器压栈,要不然调用的时候,会出问题的哦。特别是课程设计一的时候。
小甲鱼最新课程 -> https://ilovefishc.com
 楼主| 发表于 2012-8-13 22:18:51 | 显示全部楼层
lukelqz 发表于 2012-8-13 09:24
10000H就是左移4位啊。呵呵。这题有技巧的。我开始做的也很麻烦。不过小甲鱼的视频中有提示的。

原来如此,我没有很好地利用65536的特点
小甲鱼最新课程 -> https://ilovefishc.com
 楼主| 发表于 2012-8-13 22:20:36 | 显示全部楼层
lukelqz 发表于 2012-8-13 09:24
10000H就是左移4位啊。呵呵。这题有技巧的。我开始做的也很麻烦。不过小甲鱼的视频中有提示的。

你的书是不是第一版的?怎么有si?
  1.         divdw:
  2.                 push ax
  3.                 mov ax,dx
  4.                 xor dx,dx
  5.                 div cx
  6.                 mov bx,ax
  7.                 pop ax
  8.                 div cx
  9.                 mov cx,dx
  10.                 mov dx,bx
  11.                 ret
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
 楼主| 发表于 2012-8-13 22:22:08 | 显示全部楼层
lukelqz 发表于 2012-8-13 09:27
建议你把子程序中用到的寄存器压栈,要不然调用的时候,会出问题的哦。特别是课程设计一的时候。

的确,子程序调用时最好先压栈,,不过我觉得这题,,似乎没必要
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2012-8-14 08:55:13 | 显示全部楼层
张国祥 发表于 2012-8-13 22:22
的确,子程序调用时最好先压栈,,不过我觉得这题,,似乎没必要

我开始觉得没必要,后来写课程设计一就感觉很有必要了。主程序用到很多寄存器,子程序又来用,很容易出错
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2012-8-14 09:00:09 | 显示全部楼层
张国祥 发表于 2012-8-13 22:20
你的书是不是第一版的?怎么有si?

一样的,你用的是bx,我用的是si。都可以。你用bx没有压栈而已。
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2013-3-19 15:46:34 | 显示全部楼层
我也正在努力的学习那一章节
小甲鱼最新课程 -> https://ilovefishc.com
 楼主| 发表于 2013-3-23 12:44:14 | 显示全部楼层
狼翌北辰 发表于 2013-3-19 15:46
我也正在努力的学习那一章节

:D加油学习!~
小甲鱼最新课程 -> https://ilovefishc.com
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-7-2 15:42

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表