|
@@ -0,0 +1,73 @@
|
|
|
+{ %cpu=i386 }
|
|
|
+{ %opt=-Cg- }
|
|
|
+
|
|
|
+ (*$ifdef FPC *)
|
|
|
+ (*$z1*)
|
|
|
+ (*$mode delphi *)
|
|
|
+ (*$packset 1 *)
|
|
|
+ (*$asmmode intel *)
|
|
|
+ (*$endif *)
|
|
|
+ (*$apptype console *)
|
|
|
+
|
|
|
+ program asm_test;
|
|
|
+ type
|
|
|
+ tr=packed record
|
|
|
+ case integer of
|
|
|
+ 1: (bytes: array [0..31] of byte);
|
|
|
+ 2: (a,b,c,d,e,f,g,h: byte);
|
|
|
+ 3: (aa,bb,cc,dd: word);
|
|
|
+ end;
|
|
|
+
|
|
|
+ var
|
|
|
+ r: tr;
|
|
|
+
|
|
|
+ function check_byte:boolean;
|
|
|
+ asm
|
|
|
+ cmp [r.a],0
|
|
|
+ setnz al
|
|
|
+ end;
|
|
|
+
|
|
|
+ function check_byte_as_dword:boolean;
|
|
|
+ asm
|
|
|
+ // the dword ptr has to override the size of the field declaration
|
|
|
+ cmp dword ptr [r.a],0
|
|
|
+ setnz al
|
|
|
+ end;
|
|
|
+
|
|
|
+
|
|
|
+ function check_word:boolean;
|
|
|
+ asm
|
|
|
+ cmp [r.aa],0
|
|
|
+ setnz al
|
|
|
+ end;
|
|
|
+
|
|
|
+
|
|
|
+ function check_word_as_dword:boolean;
|
|
|
+ asm
|
|
|
+ // the dword ptr has to override the size of the field declaration
|
|
|
+ cmp dword ptr [r.aa],0
|
|
|
+ setnz al
|
|
|
+ end;
|
|
|
+
|
|
|
+
|
|
|
+ begin
|
|
|
+ fillchar(r,sizeof(r),#$ff);
|
|
|
+ r.a:=0;
|
|
|
+ if check_byte then
|
|
|
+ halt(1);
|
|
|
+ if not check_byte_as_dword then
|
|
|
+ halt(2);
|
|
|
+ r.aa:=0;
|
|
|
+ if check_word then
|
|
|
+ halt(3);
|
|
|
+ if not check_word_as_dword then
|
|
|
+ halt(4);
|
|
|
+ fillchar(r,sizeof(r),#$ff);
|
|
|
+ r.a:=1;
|
|
|
+ if not check_byte then
|
|
|
+ halt(5);
|
|
|
+ r.aa:=1;
|
|
|
+ if not check_word then
|
|
|
+ halt(6);
|
|
|
+ end.
|
|
|
+
|