初学Delphi嵌入汇编[20]

var

I: Integer;

begin

//Integer 类型是4字节(32位)有符号整数, 最高位是符号位, 如果是正数, 符号位 是 0、负数的符号位是1

//所以 Integer 的最大值是: 01111111 11111111 11111111 111111112

asm
mov I, 01111111111111111111111111111111B;
end;
ShowMessage(IntToStr(I)); {2147483647}

//有符号整数的负数等于相同正数的反码 + 1; Integer 最大值是:

//01111111 11111111 11111111 111111112; 其反码是:  

//10000000 00000000 00000000 000000002; 反码 + 1 以后是:

//10000000 00000000 00000000 000000012

asm
mov I, 10000000000000000000000000000001B;
end;
ShowMessage(IntToStr(I)); {-2147483647}

//那 Integer 的最小值是多少呢?

//应该是: 10000000 00000000 00000000 000000002

asm
mov I, 10000000000000000000000000000000B;
end;
ShowMessage(IntToStr(I)); {-2147483648}

//11111111 11111111 11111111 111111112 是?

asm
mov I, 11111111111111111111111111111111B;
end;
ShowMessage(IntToStr(I)); {-1}

//Integer 类型的 0 在内存中是: 00000000 00000000 00000000 000000002

asm
mov I, 00000000000000000000000000000000B;
end;
ShowMessage(IntToStr(I)); {0}

//Integer 类型的 10010 的二进制是: 00000000 00000000 00000000 011001002

asm
mov I, 00000000000000000000000001100100B;
end;
ShowMessage(IntToStr(I)); {100}

//算 Integer 类型的 -10010:

//00000000 00000000 00000000 01100100 的反码是:

//11111111 11111111 11111111 10011011 ; 反码 + 1 以后是:

//11111111 11111111 11111111 10011100

asm
mov I, 11111111111111111111111110011100B;
end;
ShowMessage(IntToStr(I)); {-100}
end;

时间: 2024-08-02 16:34:48

初学Delphi嵌入汇编[20]的相关文章

初学Delphi嵌入汇编[3]

前面知道了一个汇编的赋值指令(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

初学Delphi嵌入汇编[21]

除了 Byte.Word.Cardinal.Integer 外, Delphi 的整数类型还有: Longint.Longword.Shortint.Smallint.Int64 其中 Longint 相当于 Integer; Longword 相当于 Cardinal. 这样还有三种类型: Shortint.Smallint.Int64//Shortint 是1字节(8位)有符号整数 var I: Shortint; begin //其最大值是: 011111112 asm mov I, 01

初学Delphi嵌入汇编[18]

汇编中的SHL(左移).SHR(右移)命令也是和 Delphi 一样的.var ByteNum: Byte; begin //右移 shr asm mov al, 10000000B {128} shr al, 1 {shr 10000000 一次会得到 01000000} mov ByteNum, al end; ShowMessage(IntToStr(ByteNum)); {64; shr 相当于 ÷2} //左移 shl asm mov al, 00000001B {1} shl al,

初学Delphi嵌入汇编[16]

关于进制: 生活中有 7进制(星期).60进制(小时).10进制(算术)等等. 计算机要用到 10进制.16进制.2进制和 8进制. 8进制用得少了, 但也有, 譬如 Unix 服务器上的文件属性. 2进制是计算机容易识别的; 10进制是人容易识别的, 据说 10进制源自于人有十个手 指. 计算机为什么会使用 8进制和 16进制呢? 因为: 23=8; 24=16; 这样比较容易和 2进 制换算. 从这里也能看出, 2进制和 10进制的换算相对复杂些. 下面例子中说明了进制的表示方法, 七个函数

初学Delphi嵌入汇编[12]

//在汇编代码中使用 Result function Fun(x: Integer): Integer; asm mov ecx, &x dec ecx {汇编中的 dec 是减 1 指令, 和 Delphi 是一样的} mov @Result, ecx {在本例中去掉 @ 也可以, 暂时不知怎么回事} end; //测试 procedure TForm1.Button1Click(Sender: TObject); var i: Integer; begin i := 100; i := Fu

初学Delphi嵌入汇编[11]

//Delphi 函数function DelphiFun(x: Integer): Integer; begin Result := x * 2; end; //汇编函数, 和上面的函数是同样的功能function AsmFun(x: Integer): Integer; asm add eax, eax {eax 可以获取第一个参数, 同时又是函数的返回值, 所以可以如此 简洁!} end; //测试 DelphiFunprocedure TForm1.Button1Click(Sender

初学Delphi嵌入汇编[9]

//可以用 asm 代替 begin function Fun(x: Integer): Integer; asm mov eax, x inc eax end; { 汇编中的 inc 指令和 Delphi 中的 inc 是一样的; 本例也同时证明 eax 寄存器确实保存着函数的返回值. } procedure TForm1.Button1Click(Sender: TObject); var i: Integer; begin i := 8; i := Fun(i); ShowMessage(

初学Delphi嵌入汇编[6]

//在汇编中访问 Delphi 的变量可以使用 & 操作符 procedure Proc(str1,str2: string); var s1,s2: string; begin asm mov ecx, &str1 {} mov edx, &str2 mov &s1, ecx {} mov &s2, edx end; ShowMessage(s1 + s2); end; {在没有歧义的情况下, 操作符 & 是可以省略的, 譬如上面的例子就可以省略} //测

初学Delphi嵌入汇编[1]

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