日记?
今天弄了一晚上的篮球队的招新,虽然我不是骨干,但是我也是和其他同学一起在北三的球场来知道学弟们。从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
如果是我来写99乘法表,我大概直接就一句puts("1x1=1 1x2=2 1x3=3 1x4=4 ....完事儿。
因为从优化的角度上而言,99乘法表的内容完全可以手打。这样的话程序每次执行就只需要显示字符串就可以了。
个人认为对于99乘法表这种一次性的开发,不用讲究什么优雅,在自己机器上运行一遍得到结果就行了。 0xAA55 发表于 2018-9-4 02:16
如果是我来写99乘法表,我大概直接就一句puts("1x1=1 1x2=2 1x3=3 1x4=4 ....完事儿。
因为从优化的角度上 ...
哦哦,有道理。
页:
[1]