delphi内嵌汇编
{
前面知道了一个汇编的赋值指令(MOV), 再了解一个加法指令(ADD), 就可以做个例子了.
譬如: ADD AX,BX; 这相当于 Delphi 中的 AX := AX + BX;
另外提前来个列表 - Delphi 可以用汇编管理以下寄存器:
32 位寄存器: EAX EBX ECX EDX ESP EBP ESI EDI
16 位寄存器: AX BX CX DX SP BP SI DI
8 位寄存器 : AL BL CL DL AH BH CH DH
16 位段寄存器: CS DS SS ES 以及协处理器寄存器堆栈: ST
}
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
btn1: TButton;
procedure btn1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
//使用汇编的函数
function add(x,y: Short): Integer;
var
count: short;
begin
asm
MOV AX,x {把 x 值放入寄存器 EAX}
MOV CX,y {把 y 值放入寄存器 ECX}
ADD AX,CX {把 EAX + ECX 的值放入 EAX}
MOV count,AX {把 EAX 的值给变量 count}
end;
Result := count; {返回值}
{asm 中每个语句换行即可分句, 无须 ; 在这里加上也没有问题}
end;
//使用汇编的函数
function add2(x,y: Integer): Integer;
var
count: Integer;
begin
asm
MOV EAX,x {把 x 值放入寄存器 EAX}
MOV EbX,y {把 y 值放入寄存器 ECX}
mov Ecx,
@s:ADD EAX,EbX {把 EAX + ECX 的值放入 EAX} {内部标签必须使用 @ 前缀; 也可以使用 Delphi 的标签}
loop @s
MOV count,EAX {把 EAX 的值给变量 count}
end;
Result := count; {返回值}
{asm 中每个语句换行即可分句, 无须 ; 在这里加上也没有问题}
end;
function add3(x,y:integer):Integer;
var
i:Integer;
begin
result:=x;
for i:= to do
Result:= result+y;
end;
//测试
procedure TForm1.btn1Click(Sender: TObject);
var
i: Integer;
t:Cardinal;
begin
//两个add方法都可以
//i := add(2,4);
t:=GetTickCount;
i:=add3(,);
t:= GetTickCount-t;
Self.Caption:= IntToStr(t);
//没想到汇编 耗时更长,也许delphi自带的编译器 优化的很不错了
t:=;
t:=GetTickCount;
i := add2(,);
t:= GetTickCount-t;
Self.Caption:=Self.Caption+';'+ IntToStr(t)+';'+inttostr(i);
// ShowMessage(IntToStr(i)); {6}
end;
end.
delphi内嵌汇编的更多相关文章
- Delphi内嵌汇编语言BASM精要(转帖)
1 BASM概念简要 汇编语句由指令和零至三个表达式构成.表达式由常数(立即数).寄存器和标识符构成.例如: movsb // 单指令语句 jmp @Here // 一个表达式: ...
- 【转】Delphi内嵌ASM简易教程
Delphi内嵌ASM简易教程 作者:heiying2006-03-19 18:33分类:默认分类标签: 前言 Delphi作为一个快速高效的开发平台,使用的人越来越多,但熟悉在Delphi代码中嵌入 ...
- Beennan的内嵌汇编指导(译)Brennan's Guide to Inline Assembly
注:写在前面,这是一篇翻译文章,本人的英文水平很有限,但内嵌汇编是学习操作系统不可少的知识,本人也常去查看这方面的内容,本文是在做mit的jos实验中的一篇关于内嵌汇编的介绍.关于常用的内嵌汇编(AT ...
- C内嵌汇编-格式
C内嵌汇编-格式: __asm__(汇编语句部分:输出部分:输入部分破坏描述部分);C内嵌汇编以关键字"__asm__"或"asm"开始, 下辖四个部分, 各部 ...
- Linux内核--C语言中内嵌汇编 asm __volatile__
在内嵌汇编中,可以将C语言表达式指定为汇编指令的操作数,而且不用去管如何将C语言表达式的值读入哪个寄存器,以及如何将计算结果写回C 变量,你只要告诉程序中C语言表达式与汇编指令操作数之间的对应关系即可 ...
- 转: __asm__ __volatile__内嵌汇编用法简述
from: http://www.embedu.org/Column/Column28.htm __asm__ __volatile__内嵌汇编用法简述 作者:刘老师,华清远见嵌入式学院高级讲师,AR ...
- Linux内核系列—C语言中内嵌汇编 asm __volatile__,asm__volatile_【转】
转自:http://www.bkjia.com/Androidjc/1109412.html 在内嵌汇编中,可以将C语言表达式指定为汇编指令的操作数,而且不用去管如何将C语言表达式的值读入哪个寄存器, ...
- ARM GCC 内嵌汇编手册
转自:http://blogold.chinaunix.net/u2/69404/showart_1922655.html ARM GCC 内嵌(inline)汇编手册 关于这篇文档这篇文章是本人为方 ...
- arm汇编(c内嵌汇编及c和汇编互调)
C语言编译成汇编: arm-linux-gcc -S test.c -o test.S C语言编译成可执行文件: arm-linux-gcc test.c -o test 多个文件编译链接: arm- ...
随机推荐
- flutter之VSCode下Flutter常用终端命令行
https://www.cnblogs.com/lxlx1798/p/11049922.html 梁飞宇 [Flutter学习]之VSCode下Flutter常用终端命令行 Flutter 常用命令行 ...
- Codeforces Round #554 (Div. 2) 选做
C. Neko does Maths 题意 给 \(a,b\) ,求一个最小的 \(k\) 使得 \(\text{lcm}(a+k,b+k)\) 最小. \(a,b\le 10^9\) 题解 \(\g ...
- etcd入门
简介 etcd是CoreOS团队于2013年6月发起的开源项目,它的目标是构建一个高可用的分布式键值(key-value)数据库. etcd内部采用raft协议作为一致性算法,基于Go语言实现. et ...
- php笔记04
PHP+MySQL 连接数据库 mysqli <?php $servername="localhost"; $username="root"; $pass ...
- P 1041 考试座位号
P 1041 考试座位号 转跳点:
- uniapp 小程序实现自定义底部导航栏(tarbar)
在小程序开发中,默认底部导航栏很难满足实际需求,好在官方给出了自定义形式,效果如下: 话不多说,直接上代码 1.组件 custom-tarbar.vue文件 <template> < ...
- 【测试】性能测试及性能测试工具Loadrunner
性能测试简介 软件系统的性能包括很多方面,有执行效率,资源占用,系统稳定性,安全性,兼容性,可靠性,可扩展性等.这些都是可以衡量一个软件系统性能好坏的指标.而性能测试是指通过自动化测试工具去模拟多种正 ...
- Spring-IOC(基于XML配置)
什么是IOC? IOC: Inversion of Control(控制反转). 控制反转:将对象的创建权反转给(交给)Spring. 在使用Spring框架之后,对象的实例不再由调用者来创建,而 是 ...
- 《新标准C++程序设计》3.3-3.4(C++学习笔记7)
1.构造函数.析构函数和变量的生存期 构造函数在对象生成时会被调用,析构函数在对象消亡时会被调用. 程序示例分析: (1) #include<iostream> using namespa ...
- mvvm双向绑定机制的原理和代码实现
mvvm框架的双向绑定,即当对象改变时,自动改变相关的dom元素的值,反之,当dom元素改变时,能自动更新对象的值,当然dom元素一般是指可输出的input元素. 1. 首先实现单向绑定,在指定对象的 ...