技术宅的结界

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

QQ登录

只需一步,快速开始

搜索
热搜: 下载 VB C 实现 编写
查看: 141|回复: 2
收起左侧

日记?

[复制链接]

10

主题

91

帖子

685

积分

用户组: 大·技术宅

UID
3808
精华
1
威望
15 点
宅币
516 个
贡献
43 次
宅之契约
0 份
在线时间
87 小时
注册时间
2018-5-6
发表于 2018-9-4 00:59:00 | 显示全部楼层 |阅读模式

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

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

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

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

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

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

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

[Asm] 纯文本查看 复制代码
assume cs:codesg, ds:datasg, ss:stacksg
datasg segment
		dw 1,2,3,4,0,0,0,0						;4x4乘法表的乘数部分
		dw 1,2,3,4,0,0,0,0
		dw 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0		;用于存储结果
datasg ends

stacksg segment									;栈段
		dw 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
stacksg ends


codesg segment
start:
		mov ax,stacksg
		mov ss,ax
		mov sp,32				;设置栈顶指针和栈
		
		mov ax,datasg
		mov ds,ax
		mov bx,0				;设置数据段完毕
		
		mov cx,4				;第一次循环,设置循环次数是4,因为4x4的乘法表
		mov di,0				;用于记录结果写到了第几个
		
		
s0:		push cx
		
		mov cx,4				;第二层循环,设置循环次数是4,原因同上
		mov si,0
		
s1:		push cx
		mov dx,0				;dx寄存器用于临时存储乘法结果
		mov cx,ds:[bx]			;循环次数为datasg段第一行的数
		
		
s2:		add dx,ds:[si+16]		;用累加法来计算乘法
		loop s2
		
		add si,2				;移向下一个字,含有两字节
		mov ds:[bx+di+32],dl
		inc di
		pop cx					;弹栈,将cx恢复为原来的数值
		loop s1
		
		add bx,2				;移向下一个字
		pop cx					;弹栈,原理同上
		loop s0
		
		mov ax,4c00h			;函数返回
		int 21h
codesg ends

end start
		


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

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

good night
菜鸟一枚,直接指正,不必留情

1004

主题

2229

帖子

5万

积分

用户组: 管理员

一只技术宅

UID
1
精华
199
威望
263 点
宅币
16626 个
贡献
33265 次
宅之契约
0 份
在线时间
1590 小时
注册时间
2014-1-26
发表于 2018-9-4 02:16:54 | 显示全部楼层
如果是我来写99乘法表,我大概直接就一句puts("1x1=1 1x2=2 1x3=3 1x4=4 ....完事儿。
因为从优化的角度上而言,99乘法表的内容完全可以手打。这样的话程序每次执行就只需要显示字符串就可以了。
个人认为对于99乘法表这种一次性的开发,不用讲究什么优雅,在自己机器上运行一遍得到结果就行了。

10

主题

91

帖子

685

积分

用户组: 大·技术宅

UID
3808
精华
1
威望
15 点
宅币
516 个
贡献
43 次
宅之契约
0 份
在线时间
87 小时
注册时间
2018-5-6
 楼主| 发表于 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, 2018-11-13 07:14 , Processed in 0.095293 second(s), 32 queries , Gzip On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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