- UID
- 3808
- 精华
- 积分
- 1480
- 威望
- 点
- 宅币
- 个
- 贡献
- 次
- 宅之契约
- 份
- 最后登录
- 1970-1-1
- 在线时间
- 小时
|
今天弄了一晚上的篮球队的招新,虽然我不是骨干,但是我也是和其他同学一起在北三的球场来知道学弟们。从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:[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
|
|