汇编看不懂(32分)

  • 主题发起人 主题发起人 烂泥
  • 开始时间 开始时间

烂泥

Unregistered / Unconfirmed
GUEST, unregistred user!
demo下DB/bkquery 中的代码看不懂

var
Guard: Integer;
Numbers: Integer;

{ Thread safe increment of Numbers to guarantee the result is unique }

function GetUniqueNumber: Integer;
asm
@@1: MOV EDX,1
XCHG Guard,EDX
OR EDX,EDX
JNZ @@2
MOV EAX,Numbers
INC EAX
MOV Numbers,EAX
MOV Guard,EDX
RET

@@2: PUSH 0
CALL Sleep
JMP @@1
end;
 
var
Guard: Integer;
Numbers: Integer;
asm
@@1: MOV EDX,1
XCHG Guard,EDX
OR EDX,EDX
JNZ @@2
MOV EAX,Numbers
INC EAX
MOV Numbers,EAX
MOV Guard,EDX
RET @@2: PUSH 0
CALL Sleep
JMP @@1
end
==> pas代码:
var
EDX: Integer;
Guard: Integer;
Numbers: Integer;
begin
repeat
EDX := Guard;
Guard := 1;
Sleep(0);
until EDX <> 0;
Inc(Numbers);
Guard := EDX;
end;
 
那么在这里使用汇编的好处又是什么呢?
干脆用 pas 代码不行吗?
 
别问我呀, 问作者去
 
哦,
明白了
谢谢
 
咦,你现在搞汇编呀。
 
to: coao
么啦!
 
呵呵,死循环啊。
 
解释如下:
function GetUniqueNumber: Integer;
asm //在Pascal中内嵌汇编语言
@@1: MOV EDX,1 //寄存器EDX:=1
XCHG Guard,EDX //交换变量和EDX值
OR EDX,EDX //逻辑或,结果送EDX
JNZ @@2 //不等零则转标号@@2
MOV EAX,Numbers //让EAX:=Numbers
INC EAX //EAX:=EAX+1
MOV Numbers,EAX //Numbers:=EAX
MOV Guard,EDX //Guard:=EDX
RET //跳转
@@2: PUSH 0 //将0压入堆栈
CALL Sleep //进入过程Sleep
JMP @@1 //无条件转到标号@@1
end;

 
多人接受答案了。
 
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
高手!佩服!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

这段代码用于同步读取和设置Numbers变量!!!!
XCHG Guard,EDX

这是至关重要的一句!!!不过不知道要是有多个CPU同时执行,会不会有问题!如果
不是对效率要求特别高,我想还是用临界区等系统提供的方法为妙!

To:steve
不是死循环!
 
To:Another_eYes

var
EDX: Integer;
Guard: Integer;
Numbers: Integer;
begin
repeat
EDX := Guard; ///// 1
Guard := 1; ///// 2
Sleep(0);
until EDX <> 0;
Inc(Numbers);
Guard := EDX;
end;

好像改的不对,就算改对了也会有问题——在执行1,2句之间可能会被打断,那就糟了!
 
后退
顶部