翻译一半的Delphi汇编帮助

【学习笔记】从eXeScope到汇编与反汇编、加壳与脱壳的理解         由于博主需要对.exe文件的内部程序进行修改,因此今天面向百度编程学习了如何修改.exe文件。通过百度,笔者发现了eXeScope这款神器,并基于此神器对“汇编与反汇编”、“壳”的概念有了一定程度的了解。特写作此文,记录下自身的收获。 目录汇编Assembly反汇编DisassemblyeXeScope软件介绍:壳壳的概念壳的种类加壳和脱壳技术加壳的解压原理    &nbsp. 阅读详情

 The built-in assembler allows you to write assembly code within Delphi programs. It has the following features:
内嵌的汇编器允许在delphi程序中书写汇编代码,他有如下特性:

Allows for inline assembly
允许内嵌汇编
    Supports all instructions found in the Intel Pentium III, Intel MMX extensions, Streaming SIMD
 Extensions (SSE), and the AMD Athlon (including 3D Now!)
支持所有指令,如英特尔奔三处理器,英特尔MMX扩展,Streaming SIMD扩展(SSE),以及AMD Athlon处理器(包括3D)
    Provides no macro support, but allows for pure assembly function procedures
不提供宏支持,但允许纯汇编函数过程
    Permits the use of Delphi identifiers, such as constants, types, and variables in assembly statements
允许使用delphi标识符,诸如在汇编段内的常量,类型和变量
As an alternative to the built-in assembler, you can link to object files that contain external procedures and functions. See External declarations for more information.
当替代内置汇编的时候,你可以链接到一个包含有外部过程和函数的目标文件。更多的信息查看外部声明。

Note
注意,如果你有外部汇编代码,你想把它们用在你的应用程序中,你要考虑在Delphi中重写他,或者最底限度的使用内嵌汇编来实现。
If you have external assembly code that you want to use in your applications, you should consider rewriting it in the Delphi language or minimally reimplement it using the inline assembler.


The built-in assembler is accessed through asm statements, which have the form
内嵌汇编通过asm标识符来存储,使用end段来结束。
asm statementList end

where statementList is a sequence of assembly statements separated by semicolons, end-of-line characters, or Delphi comments.
汇编段使用分号来分割汇编代码段,字符的末尾可以使用delphi注释。

Comments in an asm statement must be in Delphi style. A semicolon does not indicate that the rest of the line is a comment.
内嵌汇编的注释必须是delphi的风格,分号并不能表示当前行剩余部分就是注释。

The reserved word inline and the directive assembler are maintained for backward compatibility only. They have no effect on the compiler.
保留字内联汇编指示符是向后兼容的,他们对编译器没有影响。

Register use
寄存器的使用
In general, the rules of register use in an asm statement are the same as those of an external procedure or function. An asm statement must preserve the EDI, ESI, ESP, EBP, and EBX registers, but can freely modify the EAX, ECX, and EDX registers. On entry to an asm statement, EBP points to the current stack frame and ESP points to the top of the stack. Except for ESP and EBP, an asm statement can assume nothing about register contents on entry to the statement.

一般情况下,内嵌汇编段的寄存器使用规则同外部的过程或函数的是相同的。汇编中必须保留EDI,ESI,ESP,EBP和EBX寄存器,但EAX,ECX和EDX寄存器可以随意的修改。在汇编段的入口,EBP指向当前堆栈帧,ESP执行堆栈的顶部。除了ESP和EBP,汇编段能够....

表达式
The built-in assembler evaluates all expressions as 32-bit integer values. It doesn't support floating-point and string values, except string constants.

Expressions are built from expression elements and operators, and each expression has an associated expression class and expression type.
内嵌汇编计算所有三十二为整形值。他不支持浮点和字符值,字符串常量除外。
表达式使用表达式元素和操作符建立,每一个表达式都一个关联的表达式类和表达式类型。
Differences between Object Pascal and assembler expressions
Object Pascal和汇编表达式的不同:
内嵌汇编和delphi表达式最大的不同是,汇编表达式必须解决能够在编译时被计算的常量。
例如,给出如下声明:
const
  X = 10;
  Y = 20;
var
  Z: Integer;

the following is a valid statement.
下面是有效的表达式段
asm
  MOV     Z,X+Y
end;

Because both X and Y are constants, the expression X + Y is a convenient way of writing the constant 30, and the resulting instruction simply moves of the value 30 into the variable Z. But if X and Y are variables--
因为x和y都是常量,表达式x+y是一个简单方法写的常量30,并起在结果构造中简单的移动值30到变量z中。但是如果x和y是变量。

var
  X, Y: Integer;

the built-in assembler cannot compute the value of X + Y at compile time. In this case, to move the sum of X and Y into Z you would use
内嵌汇编不能再编译期计算x+y的值,在这种情况下,要移动x和y到z中,你要使用:

asm
  MOV     EAX,X
  ADD     EAX,Y
  MOV     Z,EAX
end;

In a Delphi expression, a variable reference denotes the contents of the variable. But in an assembler expression, a variable reference denotes the address of the variable. In Delphi the expression X + 4 (where X is a variable) means the contents of X plus 4, while to the built-in assembler it means the contents of the word at the address four bytes higher than the address of X. So, even though you're allowed to write
在delphi表达式中,一个变量引用表示变量的内容。但在汇编表达式中,一个变量引用表示变量的地址。在delphi表达式中x+4(变量在哪)意味着x+4的内容,相比在内嵌汇编中他意味着高于x地址的4个字节字的内容。因此,及时你允许去写

asm
  MOV     EAX,X+4
end;

this code doesn't load the value of X plus 4 into AX; instead, it loads the value of a word stored four bytes beyond X. The correct way to add 4 to the contents of X is
这个代码没有加载x加4到AX寄存器中,他加载了在x后4个字节存储的一个字的值。

asm
  MOV     EAX,X
  ADD     EAX,4
end;

表达式常量
内嵌汇编支持两种类型的常量:numberic和string常量

Numberic常量
Numeric constants must be integers, and their values must be between -2,147,483,648 and 4,294,967,295.

By default, numeric constants use decimal notation, but the built-in assembler also supports binary, octal, and hexadecimal. Binary notation is selected by writing a B after the number, octal notation by writing an O after the number, and hexadecimal notation by writing an H after the number or a $ before the number.

Numeric constants must start with one of the digits 0 through 9 or the $ character. When you write a hexadecimal constant using the H suffix, an extra zero is required in front of the number if the first significant digit is one of the digits A through F. For example, 0BAD4H and $BAD4 are hexadecimal constants, but BAD4H is an identifier because it starts with a letter.
数字常量必须是整数,而他的值必须在-2147483648到4294967295之间。
默认情况下,数字常量可以使用decimal符号,但是在内嵌汇编中也支持二进制,八进制和十六进制。二进制符号选择使用在数字后面加B,八进制符号是在数字后边加O,十六进制符号是在数字后边加H或者在数字前加$

String常量
String constants must be enclosed in single or double quotation marks. Two consecutive quotation marks of the same type as the enclosing quotation marks count as only one character. Here are some examples of string constants:
字符串常量必须使用单引号或者双引号标记,最为两个封闭引号字符只有一个同类型的连续引号。这里有些字符串常量的例子:
'Z'
'Delphi'
'Linux'
"That's all folks"
'"That''s all folks, " he siad.'
'100'
'"'
"'"
String constants of any length are allowed in DB directives, and cause allocation of a sequence of bytes containing the ASCII values of the characters in the string. In all other cases, a string constant can be no longer than four characters and denotes a numeric value which can participate in an expression. The numeric value of a string constant is calculated as

Ord(Ch1) + Ord(Ch2) shl 8 + Ord(Ch3) shl 16 + Ord(Ch4) shl 24

where Ch1 is the rightmost (last) character and Ch4 is the leftmost (first) character. If the string is shorter than four characters, the leftmost characters are assumed to be zero. The following table shows string constants and their numeric values.

String examples and their values

任意长度的字符串常量是允许使用DB指令的。并且...所有其他情况,一个字串常量不能超过4个字符并表示一个数值,可以在表达式中作为一个规则。一个字符串常量值的计算方法是:
Ord(Ch1) + Ord(Ch2) shl 8 + Ord(Ch3) shl 16 + Ord(Ch4) shl 24
ch1是最右侧(最后)一个字符,ch4是最左边(第一)个字符。如果字串比4个字符短,最左边的字符将被忽略为0,下面的表现是了字符串常量和他们的数值值。

字串示例和他们的值:
String    Value
'a'    00000061H
'ba'    00006261H
'cba'    00636261H
'dcba'    64636261H
'a '    00006120H
'   a'    20202061H
'a' * 2    000000E2H
'a'-'A'    00000020H
not 'a'    FFFFFF9EH

寄存器常量
以下为CPU保留字寄存器符号:
CPU registers
32-bit general purpose    EAX  EBX  ECX  EDX    32-bit pointer or index    ESP  EBP  ESI  EDI
16-bit general purpose    AX  BX  CX  DX    16-bit pointer or index    SP  BP  SI  DI
8-bit low registers    AL  BL  CL  DL    16-bit segment registers    CS  DS  SS  ES
32-bit segment registers    FS  GS
8-bit high registers    AH  BH  CH  DH    Coprocessor register stack    ST

When an operand consists solely of a register name, it is called a register operand. All registers can be used as register operands, and some registers can be used in other contexts.
The base registers (BX and BP) and the index registers (SI and DI) can be written within square brackets to indicate indexing. Valid base/index register combinations are [BX], [BP], [SI], [DI], [BX+SI], [BX+DI], [BP+SI], and [BP+DI]. You can also index with all the 32-bit registers--for example, [EAX+ECX], [ESP], and [ESP+EAX+5].
当一个操作数只包含一个寄存器的名称,他被称为寄存器操作符。所有的寄存器都可以使用寄存器操作数,并且有些寄存器可以使用其他内容。基地址寄存在(BX和BP)和索引寄存器(SI和DI)可以使用方括号来定位索引。有效的基地值和索引寄存器组合是[BX],[BP],[SI],[DI],[BX+SI],[BX+DI],[BP+SI]和[BP+DI]。你也可以使用所有三十二为的寄存器--如:[EAX+ECX],[ESP],和[ESP+EAX+5]

The segment registers (ES, CS, SS, DS, FS, and GS) are supported, but segments are normally not useful in 32-bit applications.
段寄存器(ES,CS,SS,DS,FS和GS)都被支持,但段寄存器通常不使用三十二位应用当中。
The symbol ST denotes the topmost register on the 8087 floating-point register stack. Each of the eight floating-point registers can be referred to using ST(X), where X is a constant between 0 and 7 indicating the distance from the top of the register stack.
符号ST表示在8087浮点寄存器栈最顶层寄存器。每8个浮点寄存器可以使用ST(X)来引用,X是0到7的常量,定位到寄存器栈最顶层的距离。

符号
The built-in assembler allows you to access almost all Delphi identifiers in assembly language expressions, including constants, types, variables, procedures, and functions. In addition, the built-in assembler implements the special symbol @Result, which corresponds to the Result variable within the body of a function. For example, the function
在汇编语言表达式中,内嵌汇编允许你使用大多数所有的Delphi标识符。包括常量,类型,变量,过程和函数。另外,内嵌汇编实现的特殊符号@Result,也也可以在函数体中得到响应。
例如函数
function Sum(X, Y: Integer): Integer;
begin
  Result := X + Y;
end;

could be written in assembly language as
写成汇编语言是:

function Sum(X, Y: Integer): Integer; stdcall;
begin
  asm
    MOV     EAX,X
    ADD     EAX,Y
    MOV     @Result,EAX
  end;
end;

he following symbols cannot be used in asm statements:

Standard procedures and functions (for example, WriteLn and Chr).
String, floating-point, and set constants (except when loading registers).
Labels that aren't declared in the current block.
The @Result symbol outside of functions.
下面的符号不能在asm段使用:
标准的过程和函数(例如:Writeln和Chr)
字串,浮点和设定常量(除了在加载寄存器的时候)
标签不能在当前块声明。
@Result符号不能用在函数的外边。
The following table summarizes the kinds of symbol that can be used in asm statements.
下表汇集了能够用于asm段的各种符号

Symbol    Value    Class    Type
Label    Address of label    Memory reference    Size of type
Constant    Value of constant    Immediate value    0
Type    0    Memory reference    Size of type
Field    Offset of field    Memory    Size of type
Variable    Address of variable or address of a pointer to the variable    Memory reference    Size of type
Procedure    Address of procedure    Memory reference    Size of type
Function    Address of function    Memory reference    Size of type
Unit    0    Immediate value    0
@Result    Result variable offset    Memory reference    Size of type

With optimizations disabled, local variables (variables declared in procedures and functions) are always allocated on the stack and accessed relative to EBP, and the value of a local variable symbol is its signed offset from EBP. The assembler automatically adds [EBP] in references to local variables. For example, given the declaration
优化选项取消,本地变量(声明在过程和函数当中)总是被定为在栈EBP,并且

var Count: Integer;

within a function or procedure, the instruction
一个函数或过程指令

MOV     EAX,Count


assembles into MOV EAX,[EBP-4].

The built-in assembler treats var parameters as a 32-bit pointers, and the size of a var parameter is always 4. The syntax for accessing a var parameter is different from that for accessing a value parameter. To access the contents of a var parameter, you must first load the 32-bit pointer and then access the location it points to. For example,
内嵌汇编把参数作为32为指针来处理,变量参数的大小永远是4。 同步处理变量参数和值参数是不同的。要处理变量参数的内容,你必须首先加载32为指针并定位他所指向的地址来处理,例如:

function Sum(var X, Y: Integer): Integer; stdcall;
begin
  asm
    MOV     EAX,X
    MOV     EAX,[EAX]
    MOV     EDX,Y
    ADD     EAX,[EDX]
    MOV     @Result,EAX
  end;
end;

Identifiers can be qualified within asm statements. For example, given the declarations
标识符可以使用汇编段来限定。例如,给定一个声明:


type
  TPoint = record
    X, Y: Integer;
  end;
  TRect = record
    A, B: TPoint;
  end;
var
  P: TPoint;
  R: TRect;

the following constructions can be used in an asm statement to access fields.
接下来的结构能够在汇编段使用来处理域。

MOV     EAX,P.X
MOV     EDX,P.Y
MOV     ECX,R.A.X
MOV     EBX,R.B.Y

A type identifier can be used to construct variables on the fly. Each of the following instructions generates the same machine code, which loads the contents of [EDX] into EAX.
A类型标识符能够用于飞行结构变量,下面结构的每一个元素都能产生相同的代码,加载[EDX]内容到EAX寄存器中。

MOV     EAX,(TRect PTR [EDX]).B.X
MOV     EAX,TRect([EDX]).B.X
MOV     EAX,TRect[EDX].B.X
MOV     EAX,[EDX].TRect.B.X

Expression classes
表达式类

The built-in assembler divides expressions into three classes: registers, memory references, and immediate values.
内嵌汇编把表达式分成三类:寄存器,内存引用,和立即数。

An expression that consists solely of a register name is a register expression. Examples of register expressions are AX, CL, DI, and ES. Used as operands, register expressions direct the assembler to generate instructions that operate on the CPU registers.
仅仅包含一个单独的寄存器名称的表达式是寄存器表达式。寄存器表达式的例子是AX,CL,DI和ES。作为操作数,寄存器表达式直接汇编成执行操作在CPU寄存器上。

Expressions that denote memory locations are memory references. Delphi's labels, variables, typed constants, procedures, and functions belong to this category.
展示内存定位的表达式是内存引用。delphi中的标签,变量,类型常量,过程和函数属于这一范畴。

Expressions that aren't registers and aren't associated with memory locations are immediate values. This group includes Delphi's untyped constants and type identifiers.
非寄存器和非内存定位的表达式是立即数,这个群组包括无类型常量和类型标识符。


Immediate values and memory references cause different code to be generated when used as operands. For example,
作为操作数使用时,立即数和内存引用所产生的代码是不同的。例如:

const
  Start = 10;
var
  Count: Integer;
  ...
asm
  MOV     EAX,Start            { MOV EAX,xxxx }
  MOV     EBX,Count            { MOV EBX,[xxxx] }
  MOV     ECX,[Start]          { MOV ECX,[xxxx] }
  MOV     EDX,OFFSET Count     { MOV EDX,xxxx }
end;

Because Start is an immediate value, the first MOV is assembled into a move immediate instruction. The second MOV, however, is translated into a move memory instruction, as Count is a memory reference. In the third MOV, the brackets convert
Start into a memory reference (in this case, the word at offset 10 in the data segment). In the fourth MOV, the OFFSET operator converts Count into an immediate value (the offset of Count in the data segment).
因为Start是一个立即数,第一个mov被汇编成为移动立即指令。第二个mov,被翻译成移动内存指令,cout是内存引用。第三个mov,中括号转换start为一个内存引用(在这个实例中,在数据段偏移10个字)。在第四个mov,offset操作转换count为一个立即数(数据段的偏移数)


The brackets and OFFSET operator complement each other. The following asm statement produces identical machine code to the first two lines of the previous asm statement.
中括号和offset操作互为补充。下面的汇编段过程标识机器代码前段汇编代码的前两行。

asm
  MOV     EAX,OFFSET [Start]
  MOV     EBX,[OFFSET Count]
end;

Memory references and immediate values are further classified as either relocatable or absolute. Relocation is the process by which the linker assigns absolute addresses to symbols. A relocatable expression denotes a value that requires relocation at link time, while an absolute expression denotes a value that requires no such relocation. Typically, expressions that refer to labels, variables, procedures, or functions are relocatable, since the final address of these symbols is unknown at compile time. Expressions that operate solely on constants are absolute.

The built-in assembler allows you to carry out any operation on an absolute value, but it restricts operations on relocatable values to addition and subtraction of constants.
内嵌汇编允许你在抽象值上执行任何操作,但在做加法和减法重新定位值上是限制操作的。

Expression Type
表达式类型

Every built-in assembler expression has a type--or, more correctly, a size, because the assembler regards the type of an expression simply as the size of its memory location. For example, the type of an Integer variable is four, because it occupies 4 bytes. The built-in assembler performs type checking whenever possible, so in the instructions

每个内嵌汇编表达式都有一个类型,更正确的说法,一个尺寸。因为

var
  QuitFlag: Boolean;
  OutBufPtr: Word;
  ...
asm
  MOV     AL,QuitFlag
  MOV     BX,OutBufPtr
end;

the assembler checks that the size of QuitFlag is one (a byte), and that the size of OutBufPtr is two (a word). The instruction
汇编器检查QuitFlag的大小是1(1个字节),OutBufPtr的大小是2(一个字)。指令

MOV     DL,OutBufPtr

produces an error because DL is a byte-sized register and OutBufPtr is a word. The type of a memory reference can be changed through a typecast; these are correct ways of writing the previous instruction:
产生一个错误,因为DL是一个字节大小的寄存器,OutBufPtr是一个字。内存引用类型可以通过类型转来更改;有正确方法来写先前的指令。

MOV     DL,BYTE PTR OutBufPtr
MOV     DL,Byte(OutBufPtr)
MOV     DL,OutBufPtr.Byte

These MOV instructions all refer to the first (least significant) byte of the OutBufPtr variable.
这些mov质量全部指向OutBufPtr变量的第一个字节。

In some cases, a memory reference is untyped. One example is an immediate value (Buffer) enclosed in square brackets:
在某些情况下,内存引用没有被定义,方括号中的立即数的例子:

procedure Example(var Buffer);
asm
  MOV AL, [Buffer]
  MOV CX, [Buffer]
  MOV EDX, [Buffer]
end;

The built-in assembler permits these instructions, because the expression [Buffer] has no type--it just means "the contents of the location indicated by Buffer," and the type can be determined from the first operand (byte for AL, word for CX, and double-word for EDX).

In cases where the type can't be determined from another operand, the built-in assembler requires an explicit typecast. For example,

INC     BYTE PTR [ECX]
IMUL    WORD PTR [EDX]

The following table summarizes the predefined type symbols that the built-in assembler provides in addition to any currently declared Delphi types.

Predefined type symbols
预定义类型符号
Symbol    Type
BYTE    1
WORD    2
DWORD    4
QWORD    8
TBYTE    10


delphi中formatFloat代码初探 由于项目需要,需要在qt下实现floatformat的函数。之前写过一个,但是写得不好。决定重新写一个,参考delphi xe2下的实现。把xe2下的相关代码都看了一遍,xe2的代码思路在这里贴出来。xe2下的代码在system.sysutils下,核心函数是InternalFloatToTextFmt。它有汇编的版本跟纯pacal的版本。汇编看不懂,参考的是纯pacal的版本。 整体流程是: 阅读详情

相关推荐

Win11显卡驱动安装失败的全面解决方案

Windows 11显卡驱动安装失败是一个比较常见的问题,但通过上述方法,我们可以有效地解决这一问题。方法一通过调整组策略编辑器的驱动程序安装策略,可能解决一些因签名问题导致的安装失败;而方法二则通过重装Windows 11系统,为系统提供一个全新的、干净的环境,从而可能解决更复杂的安装问题。在实际操作中,用户可以根据具体情况选择合适的方法来解决显卡驱动安装失败的问题。

nntxthml的博客 2662

Delphi 对象模型学习笔记(转)

摘要     Borland Object Pascal 对象模型(现在已经正是命名为 Delphi 语言)与其他 OOP 语言一样,都提供了一些基础服务: 如对象创建服务、对象释放服务、对象识别服务、对象信息服务,除此之外在编译器和 VCL framework 级别上提供了一些额外的服务,例如对象消息分派服务。 前言  首先说一下,Delphi 对象模型涉及的概念非常多,因此在这篇笔记中...

weixin_33725807的博客 292

HFSS微带线仿真从零到一:材料参数与求解设置优化指南

在射频电路设计中,微带线仿真涉及电磁场求解与传输线理论,其精度高度依赖材料参数和求解设置。相对介电常数、损耗角正切和导体电导率等参数直接影响特性阻抗与插入损耗,而求解频率、网格划分和参数扫描则决定仿真效率与收敛性。合理设置这些参数可显著提升S参数准确性,避免设计迭代。应用场景包括天线馈线、滤波器和微波互连。本文基于HFSS微带线仿真实践,系统讲解材料选择与参数优化全链路,帮助工程师快速复现可靠模型。

weixin_29192211的博客 79

最近的两个问题<input>与<frame src="/example/html/frame_a.html" name="showframe">

1.Q:HTML中创建表单控件的时候可以直接而不使用吗?这样看似也可以啊,那干吗用啊?   A:不用form标签也是可以提交表单的。但比较麻烦。     如果有form标签,在点击提交铵钮时,浏览器自动收集参数,并打包一个http请求到服务器,完成表单提交。在这一过程中,浏览器会根据method的     不同,将参数编码后,放在urI中(get),或者放在请求的data中(post

chllalalaa的博客 3733

深度学习中 Internal Covariate Shift 问题以及 Batch Normalization 的作用

深度学习中 Internal Covariate Shift 问题以及 Batch Normalization 的作用前言一、Batch Normalization是什么?1.1 Internal Covariate Shift1.2 Internal Covariate Shift 带来的影响1.3 如何减缓 Internal Covariate Shift 问题带来的影响白化(Whitening)白化存在的问题二、Batch Normalization2.1 传统 Normalization2.2 改进

一扣解千愁的博客 4296

Nvidia Tesla A100 驱动安装方法

Nvidia Tesla A100 驱动安装方法 遇到的问题:以前安装tesla系列、geforce系列等gpu 驱动的时候,只需执行nvidiaxxxx.run驱动包或者安装nvidiaxxxx.rpm包即可,但遇到新的GPU Nvidia Tesla A100的时候,安装完驱动似乎不起作用,找了半天资料,原来需要以下步骤才可以使用;

qq_24343177的博客 2万+

Too many local variablese解决方法

问题:运行脚本报“Too many local variablese”的错误 解决方法: 脚本拆分录制 这个错误是说明ACTION里代码的变量个数超出了它规定的范围.一般好像不能超过50个.

星辰海閣 2999

【迁移学习】域对抗迁移网络 DANN

Domain-Adversarial Training of Neural Networks

这个博客太懒了什么都没说 8416

delphi下支持64位的钩子实现

从delphi.about.com上找了一个钩子的实现代码,写得很不错,可惜不支持64位,后来有一个帖子里说参考classes单元改改,就自己改了一下,现在分享给大家 修改部分如下 const {$IF Defined(CPUX86)} CodeBytes = 2; {$ELSEIF Defined(CPUX64)} CodeBytes = 8; {$IFEND} type p

youthon的专栏 3678

eCognition易康面向对象分类批量选择样本,批量导出shp

可以的,使用这个工具条最右边那个三角尺manual editing toolbar,这是用来直接指定类别的,咱们可以拿它选完以后把指定的类别转成训练样本。另一个好处是,这个选出来的样本可以直接导出成shp,但select sample是不可以的,只能导出TTAMask也就是栅格掩膜。如果要导出shp,要在转之前导出。中间那条有点点的红线就是我的鼠标轨迹,只要碰到的对象就会全部选中,然后一点3的那个按钮就直接全部划分为林地了,十分丝滑。在弹出来的工作条里,首先选择你的类别,比如这里选一个forest。

qq_61845364的博客 4068

倾斜摄影与地面激光点云融合高精度建模研究

本文研究了倾斜摄影与地面激光点云融合精细化建模技术,并通过相应的源代码实现了建模过程。该方法将倾斜摄影和激光扫描相结合,能够获得高精度的三维建模结果,为相关领域的研究和应用提供了有力支持。近年来,倾斜摄影和激光扫描技术的快速发展为高精度三维建模提供了新的机遇和挑战。本文针对倾斜摄影与地面激光点云融合建模这一前沿领域展开研究,旨在通过相应的源代码实现精细化的建模过程。同时,使用激光扫描仪进行地面激光扫描,获取地面的点云数据。经过数据融合和精细化建模处理后,我们获得了高精度的三维建模结果。

LpmShell的博客 1245

转贴:剖析Delphi中的多态

转贴 作者:MajorSoft   1什么是多态?1.1概念 1.2多态的意义 1.3多态在delphi中如何实现的?1.3.1 继承(Inheritance) 1.3.2 虚方法、动态方法与抽象方法,VMT/DMT,静态绑定与动态绑定1.3.3 重载(Overload)与多态1.4多态种类的探讨1.4.1 两级多态1.4.2 不安全的多态2 VCL中多态的应用2.1构造与析构方法

kukle的专栏 681

第十二章 供水管网水力模型软件介绍

本文介绍了国内外主要供水管网建模软件及其特点,重点分析了某高建模软件V14的创新功能。国际主流软件包括开源的EPANET、商业软件InfoWorksWS、WaterGEMS和MIKEURBAN,各具特色但存在应用局限。某高V14软件实现了管网GIS与模型一体化管理,采用一G多网、一网多模、一模多案、网模合一技术路线,支持全信息模型建立和动态数据更新。其创新点包括水量分配理念革新(精确/模糊匹配、三种用水模式)和首创Web服务功能。通过并发计算、GPU加速等技术优化性能,具有较高性价比。

weixin_45258875的博客 207

Delphi帮助文档(翻译一)

The built-in assembler allows you to write assembly code within Delphi programs. It has the following features: //内置的汇编器使你可以在Delphi程序里编写汇编代码,它有如下功能: Allows for inline assembly 允许的内嵌汇编语言Suppor...

weixin_30755709的博客 169

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

Delphi帮助文档(翻译五)

Differences between Delphi and assembler expressions Delphi表达式和汇编表达式的区别 The most important difference between Delphi expressions and built-in assembler expressions is that assembler expressions...

weixin_30813225的博客 126

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

Delphi帮助文档(翻译四)

Labels are used in built-in assembly statements as they are in the Delphi language--by writing the label and a colon before a statement. //标签被用在内嵌汇编中因为他们在Delphi语言中->用一个标签和分号写在一个语句之前。 There ...

weixin_30267691的博客 129

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

Delphi帮助文档(翻译二)

The built-in assembler is accessed through asm statements, which have the form asm statementList end //通过具有asm statementList end形式的asm语句利用内嵌的汇编器。 where statementList is a sequence of ass...

weixin_30244681的博客 85

Delphi帮助文档(翻译六)

The built-in assembler divides expressions into three classes: registers, memory references, and immediate values. 内嵌的汇编器把表达式分为3种类型:寄存器,内存引用和立即数. An expression that consists solely of a registe...

weixin_30808253的博客 159

Delphi帮助文档(翻译三)

This syntax of an assembly statement is 汇编语句的语法 Label: PrefixOpcodeOperand1, Operand2 Label: PrefixOpcodeOperand1, Operand2 where Label is a label, Prefix is an assembly prefix opcode (ope...

weixin_30764137的博客 161

Delphi 汇编学习(五)--- Delphi 程序员永久的痛

我是个 Delphi 程序员。一直很喜欢 Delphi。虽然现在国内 Delphi 的市场越来越小众。我依然喜欢它。 一直都想用自己的微薄之力,给 Delphi 做一点点贡献。 近几日春节放假,白天访亲问友,晚上闲来无事,学习学习 SIMD 程序优化。 近两天在做图像的对比度调节的 SIMD 优化。 procedure Contrast_ScanLine(bmp: TBitmap; const intContrastValue: Integer); var X, Y : Integer; p

dbyoung的Delphi专栏 1241

初学 Delphi 嵌入汇编[1] - 汇编语言与机器语言

非科班出身, 现在才接触汇编, 惭愧呀, 好好学! 主选课本是清华大学王爽老师的《汇编语言》. 推荐 王爽老师的汇编网 汇编语言之前是机器语言. 机器语言是机器指令的集合, 机器指令是一系列二进制数字, 计算机将之转换为一系列高低电平, 而实现运算. 在 PC 机上运行机器指令的是 CPU; 不同的 CPU 有不同的指令, 所以某种汇编语言也只是针对某系列的 CPU.

代码人生 471

如何为Delphi开源跨平台计算机视觉和机器学习软件库OpenCV翻译开发Object Pascal语言接口头文件

为Delphi翻译OpenCV头文件的想法来源于最初的一个梦想...... 我想做一个类似于机器人系统的东西,带有两个可移动的摄像头,能够跟踪(直接“凝视”)给定物体并确定与物体的距离。那是 2012 年。但由于我更像是一名程序员而不是硬件工程师,这一切都是从当时现有算法的实现开始的。很快就意识到算法及其实现不是目标。目标是一个机器人系统。因此,决定使用现有的图像处理库。但是,不幸的是,在 Object Pascal 上,当时发现的现成算法库无法解决这些任务。 我非常喜欢 OpenCV,...

Delphi开发局QQ群:32422310 1652

鼓励,很多的,Delphi高手突破,外加冷水一瓢

很久没有来了,正好来了,正好看了,Delphi高手突破,http://www.csdn.net/Develop/Read_Article.asp?id=12285正好我也在动手写点东西,hahaha.有些话要说,不说如鲠在喉。当然,我不会说太多,话多是水。但是,为了方便,我还是将原文部分内容加上。关于对象内存的分配及回收不知道有人对dl这个寄存器放在这里有什么想法没有,没有的话就想

秦贤过程 1439

用 Delphi 编写 VxD 设备驱动程序

关键词:Delphi控件杂项作者:Emil Biserov(dinfo@mail.primorye.ru)(Russion) 英语翻译:Vitaly Zayko(zayko@vitsoftware.com) 中文翻译改编:Riceball(teditor@mailroom.com) 前言   用 Delphi 3.0 编写 VxD 设备驱动程序,在Delphi 3 下编译通过,Delphi 2 下

lxllovely的专栏 514
上一篇: 使用Raize实现Form嵌入PageControl中
下一篇: Bugfree中更改默认的bug列表(buglist)栏位及顺序
火龙岛主
博客等级 码龄25年 256粉丝 50原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值