找回密码
 立即注册→加入我们

QQ登录

只需一步,快速开始

搜索
热搜: 下载 VB C 实现 编写
查看: 1624|回复: 2

日记?

[复制链接]
发表于 2018-9-4 00:59:00 | 显示全部楼层 |阅读模式

欢迎访问技术宅的结界,请注册或者登录吧。

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

×
今天弄了一晚上的篮球队的招新,虽然我不是骨干,但是我也是和其他同学一起在北三的球场来知道学弟们。从17:40下课后我就往老区赶,
结果到了21:30左右才弄完了选人工作,当时都要饿没气了。不过老区外面的金牌卤肉面还是很好吃的,比较满足哈哈。XD

这两天我在自己学习汇编,从图书馆借了几本书就来看看,本来今天晚上说是要看看网上的视频就要睡觉了,因为明天8点还有辐射探测学。
但是我看到某视频下面有一个评论说:有没有人会用C内联汇编来写9x9乘法表,我心里想我还没有写过这种东西,我也要写写试试。然后就
到了这个点了......

我看汇编1周左右了,看的是王爽的汇编语言第二版(还有其他的几本书,没有来得及看),学到了第7章---几种灵活的寻址方式,就目前而
言我知道的汇编的指令还是很少,所以废了些力气来写了一个我看起来很不优雅的4x4乘法表(并且结果不漂亮,因为我还没有看到怎么给8086
cpu来输出一段字符串,就好像C语言里的printf那样)

要是C语言来写乘法表基本上就是那样的两个循环并且加上些格式控制,但是对于初识汇编的rookie来说用汇编来写还是有些难度的,说先肯定
是要有两重循环的,就好像C语言那样,但是我为了写乘法还是用了之前的用累加法来代替乘法来计算结果。其中还涉及到用栈来保存暂时的数据
一些寻址方式的灵活应用,总之在我看来要费一番功夫,看来我还是要对寻址方式更加熟悉一些。

希望有一天可以达到tangptr或者站长那样的4成功力水平,由于这个程序过于小白(其实之前的帖子也很小白),同时又是好长时间没有发帖子了
所以放到了休闲板块,也是作为一篇日记来记录今天的成长。

  1. assume cs:codesg, ds:datasg, ss:stacksg
  2. datasg segment
  3.                 dw 1,2,3,4,0,0,0,0                                                ;4x4乘法表的乘数部分
  4.                 dw 1,2,3,4,0,0,0,0
  5.                 dw 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0                ;用于存储结果
  6. datasg ends

  7. stacksg segment                                                                        ;栈段
  8.                 dw 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  9. stacksg ends


  10. codesg segment
  11. start:
  12.                 mov ax,stacksg
  13.                 mov ss,ax
  14.                 mov sp,32                                ;设置栈顶指针和栈
  15.                
  16.                 mov ax,datasg
  17.                 mov ds,ax
  18.                 mov bx,0                                ;设置数据段完毕
  19.                
  20.                 mov cx,4                                ;第一次循环,设置循环次数是4,因为4x4的乘法表
  21.                 mov di,0                                ;用于记录结果写到了第几个
  22.                
  23.                
  24. s0:                push cx
  25.                
  26.                 mov cx,4                                ;第二层循环,设置循环次数是4,原因同上
  27.                 mov si,0
  28.                
  29. s1:                push cx
  30.                 mov dx,0                                ;dx寄存器用于临时存储乘法结果
  31.                 mov cx,ds:[bx]                        ;循环次数为datasg段第一行的数
  32.                
  33.                
  34. s2:                add dx,ds:[si+16]                ;用累加法来计算乘法
  35.                 loop s2
  36.                
  37.                 add si,2                                ;移向下一个字,含有两字节
  38.                 mov ds:[bx+di+32],dl
  39.                 inc di
  40.                 pop cx                                        ;弹栈,将cx恢复为原来的数值
  41.                 loop s1
  42.                
  43.                 add bx,2                                ;移向下一个字
  44.                 pop cx                                        ;弹栈,原理同上
  45.                 loop s0
  46.                
  47.                 mov ax,4c00h                        ;函数返回
  48.                 int 21h
  49. codesg ends

  50. end start
  51.                
复制代码


下图中的黄色区域就是我之前datasg数据段中的1,2,3,4的数据
红色区域的每个字节是相乘的结果

额,鼓捣了10分钟的分享图片,没有反应,那就分享链接吧:https://pan.baidu.com/s/1DVmYBBejacZFLjRxlzpi9A

good night
回复

使用道具 举报

发表于 2018-9-4 02:16:54 | 显示全部楼层
如果是我来写99乘法表,我大概直接就一句puts("1x1=1 1x2=2 1x3=3 1x4=4 ....完事儿。
因为从优化的角度上而言,99乘法表的内容完全可以手打。这样的话程序每次执行就只需要显示字符串就可以了。
个人认为对于99乘法表这种一次性的开发,不用讲究什么优雅,在自己机器上运行一遍得到结果就行了。
回复 赞! 靠!

使用道具 举报

 楼主| 发表于 2018-9-4 11:56:02 | 显示全部楼层
0xAA55 发表于 2018-9-4 02:16
如果是我来写99乘法表,我大概直接就一句puts("1x1=1 1x2=2 1x3=3 1x4=4 ....完事儿。
因为从优化的角度上 ...

哦哦,有道理。
回复 赞! 靠!

使用道具 举报

本版积分规则

QQ|Archiver|小黑屋|技术宅的结界 ( 滇ICP备16008837号 )|网站地图

GMT+8, 2024-11-21 21:15 , Processed in 0.031287 second(s), 21 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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