族谱网 头条 人物百科

内联汇编

2020-10-16
出处:族谱网
作者:阿族小谱
浏览:529
转发:0
评论:0
使用处理器持有指令优化范例下面是一段在D语言进行行内组语的程式码。该程式码使用x86架构的浮点运算器指令来计算tan⁡⁡-->x{displaystyletanx}。此实作快于编译器产生的一

使用处理器持有指令优化范例

下面是一段在D语言进行行内组语的程式码。该程式码使用x86架构的浮点运算器指令来计算 tan ⁡ ⁡ --> x {\displaystyle \tan x} 。此实作快于编译器产生的一系列浮点数运算,行内组语也使编程人员得以使用fldpi 指令来载入在x86架构下可得到的最佳之pi估计值。

// 計算tan(x)realtan(realx){asm{fldx[EBP];// 將x值載入浮點運算器的堆疊上fxam;// 測試堆疊頂端的值是否是合法、可計算浮點數fstswAX;sahf;jctrigerr;// 若x是NAN,正負無限,或空值 // 387可以處理denormals數值SC18:fptan;// 為與8087運算器相容fptan會使堆疊頂端為1.0,再來才是tan值,fstpST(0);// 丟棄堆疊頂端的值fstswAX;sahf;jnpLret;// C2為FPU狀態變數,C2 == 1表示x超出允許的範圍;// tan之週期為pi,下面的程式碼就是將x縮至允許的範圍fldpi;fxch;SC17:fprem1;fstswAX;sahf;jpSC17;fstpST(1);// 將pi值移出堆疊jmpSC18;}trigerr:returnreal.nan;Lret:;}

系统调用(system calls)范例

在保护模式运行的应用程序无法直接呼叫专属于OS的功能。因为OS的行程空间包含核心空间(kernel mode)与用户空间(user mode);运行在用户空间的程式只能透过中断来引用专属于操作系统的功能。通常高阶语言都不提供这项功能,所以要运用行内组语将呼叫system calls的过程包装为高阶语言可辨认、呼叫的函式。

下面的C语言片段即含有一个system call的包装函式。其组语语法为GNU汇编器使用的AT&T组语语法。一般这类程式都会使用宏实作,不过为了清楚展示观念,在此列出了完整的程式码。

GNU组译器的行内组语语法相当直觉,基本型式如下:

asm("assembly code");

例如:

asm("movl %ecx, %eax");/* 複製ecx暫存器的內容至eax暫存器*/

__asm_("movb %bh, (%eax)");/* 從bh暫存器複製1位元組的資料到eax暫存器所指的記憶體區塊*/

必须注意的是,AT&T语法中的算子顺序与Windows平台下常用的MASM刚好相反。

asm 跟 __asm__ 都是合法型式;当 asm 与程式码中某些变数命名起冲突时可使用后者。

externinterrno;intfuncname(intarg1,int*arg2,intarg3){intres;__asm__volatile("int $0x80"/* 向OS拋出請求*/:"=a"(res)/* 請編譯器將結果將儲存於eax ("a")*/"+b"(arg1),/* 請編譯器將arg1存於ebx ("b")*/"+c"(arg2),/* 請編譯器將arg2存於ecx ("c")*/"+d"(arg3)/* 請編譯器將arg3存於edx ("d")*/:"a"(128)/* 該system call的編號放於eax ("a")*/:"memory","cc");/* 通知編譯器,記憶體與condition code register(決定分支的暫存器)己被更改*//* 若OS回傳負值表示錯誤;則包裝函式要設定errno global variable並回傳 -1 */if(-125<=res&&res<0){errno=-res;res=-1;}returnres;}


免责声明:以上内容版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。感谢每一位辛勤著写的作者,感谢每一位的分享。

——— 没有了 ———
编辑:阿族小谱
发表评论
写好了,提交
{{item.label}}
{{commentTotal}}条评论
{{item.userName}}
发布时间:{{item.time}}
{{item.content}}
回复
举报
点击加载更多
打赏作者
“感谢您的打赏,我会更努力的创作”
— 请选择您要打赏的金额 —
{{item.label}}
{{item.label}}
打赏成功!
“感谢您的打赏,我会更努力的创作”
返回

更多文章

更多精彩文章
打赏
私信

推荐阅读

· 汇编语言
工具典型的现代汇编器(assembler)建造目标代码,由解译组语指令集的助记符(Mnemonics)到操作码(OpCode),并解析符号名称(Symbolicnames)成为内存地址以及其它的实体。使用符号参考是汇编器的一个重要特征,它可以节省修改程序后人工转址的乏味耗时计算。基本就是把机器码变成一些字母而已,编译的时候再把输入的指令字母替换成为晦涩难懂机器码。现状随着现代软件系统越来越庞大复杂,大量经过了封装的高级语言如C/C++,Pascal/ObjectPascal也应运而生。这些新的语言使得程序员在开发过程中能够更简单,更有效率,使软件开发人员得以应付快速的软件开发的要求。而汇编语言由于其复杂性使得其适用领域逐步减小。但这并不意味着汇编已无用武之地。由于汇编更接近机器语言,能够直接对硬件进行操作,生成的程序与其他的语言相比具有更高的运行速度,占用更小的内存,因此在一些对于时效性要...
· 汇编《毕氏宗族谱》序
汇编《毕氏宗族谱》序毕臣礼曰:万物本乎天,人本乎祖。毕氏由来,起于周初。郡望河南,洛阳为先。王侯将相,文化科技,勋垂史册,代有其人。然繁衍至今,血脉有继,谱牒失传,文化散佚,族人扼腕。古人云:家之有谱,犹国之有史也。家谱,以叙人伦而肃家政也,其优,史传训言之基,聪秀成长之本,家族文化之载体。自古强国兴帮,人才为先;人才之出,化育为本;育人之要,谱牒为首。“以铜为镜,可以正衣冠;以古为镜,可以知兴替;以人为镜,可以明得失。”可是,毕氏的谱牒呢?多年来,为了补撰毕氏宗族谱,前贤不惜心血和财力,不乏其人。“敢”木匠访撰谱书之后,1984年,父毕运笳应贵州毕运簟[正平]之请完成木鱼寨一宗《简谱》,1994年,毕本泉修锛竹坎一宗《毕氏族谱》。简朴清矍尚自然,斯斯古风传墨香。惜乎囿于枝系和旧风,记名无事,视女若无,不见族人文化精神,意韵嶙峋,不够丰茂。臣德能不殆,继父命拭其锋。2000年始,十年难克其...
· 邢氏来源考查汇编(一)
古邢(音:geng下同)国,系原始氏族部落邢人居住地。“邢人作丘”,是古人类与黄河洪水作斗争、求生存作的避水台,开了古人类主观能动地抗击水患的先河,这个由被动到主动的转变,在中华文明史、中国河防史上,具有相当价值。据司马迁《史记》记载:“祖乙迁邢”,使邢丘成为商都之一,从成汤起,历八代帝王,至盘庚迁殷止。三千五百年来,由于刑丘瘗黄河泥沙下,而让“祖乙迁邢”成了一个史学、考古学界争论不休的话题。可是,如果仔细阅读、研究相关文献、史料,并结合近代相关考古著作、成果,还是可以较有把握地认定“祖乙迁邢”遗址,就在今河南武陟的商村遗址。一、“邢人作丘”,蕞尔小国大手笔邢国是个小部落,能青史留名,是因“邢人作丘”与“祖乙迁邢”,国家太小,工程太大,反差自现,引人好奇。那个时候,堪称蕞尔的邢国人,为何在生产力极低,几乎力不从心的时候,耗费大量人力财力作丘?从当时的生产生活状况着眼,就会发现直到商早期,人...
· 王姓历史名人汇编
来源:河南中华姓氏网电子书
· 邢氏来源考查汇编(二)
邢氏周公后代发源河北邢台邢姓,《左传》上所记载的:“凡蒋、刑、茅、胙、祭、周公之胤也”,说明得最为清楚,明白指出了他们是3000年前制礼作乐的周公的后代。当然,更是最值得自豪自傲的黄帝子孙。这个荣耀姓氏的始祖,根据老证,是周公的第4个儿子,由于被封食采于邢而得姓。关于邢氏的这段源流,是详载於《姓纂》一书。该书指出:“周公第四子封于邢,后为卫所灭,子孙以国为氏。”当年的邢国,爵位为侯,位置就在现在河北省,邢台县的西南。这个国家在周代初年虽然有如昙花一现,国祚并不很长,到了春秋时代就被强邻卫国所并灭。然而,却为后世留下了一个声名响亮的邢姓,堪称永垂不朽。邢姓的最早发源之地河北邢台县,在历史上可一直是大大有名。这个地方,在秦朝时被置为信都县,不久之后楚霸王又将之改为襄国,并且成为“常山王”张耳的王都。南北朝时,石勒又在这个地方建立他的赵国,一直到宋朝之时,才定名为邢台,以迄于今。因此,邢台县之地...

关于我们

关注族谱网 微信公众号,每日及时查看相关推荐,订阅互动等。

APP下载

下载族谱APP 微信公众号,每日及时查看
扫一扫添加客服微信