watermelon 发表于 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成功力水平,由于这个程序过于小白(其实之前的帖子也很小白),同时又是好长时间没有发帖子了
所以放到了休闲板块,也是作为一篇日记来记录今天的成长。

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:                        ;循环次数为datasg段第一行的数
               
               
s2:                add dx,ds:                ;用累加法来计算乘法
                loop s2
               
                add si,2                                ;移向下一个字,含有两字节
                mov ds:,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

0xAA55 发表于 2018-9-4 02:16:54

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

watermelon 发表于 2018-9-4 11:56:02

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

哦哦,有道理。
页: [1]
查看完整版本: 日记?