不需要汇编语言
使用API就行了
我给你DELPHI5在WIN2K的关机FUNCTIONProcedure Shutdown(Flag:integer);
const
  SE_SHUTDOWN_NAME = 'SeShutdownPrivilege';   // Borland forgot this declaration
  //OSVersion='Windows NT';
var
  MyVerInfo    : TOSVersionInfo;
  hToken       : THandle;
  tkp          : TTokenPrivileges;
  tkpo         : TTokenPrivileges;
  zero         : DWORD;
  OSversion    : String;begin
  MyVerInfo.dwOSVersionInfoSize := SizeOf(TOSVersionInfo);
  GetVersionEx(MyVerInfo);  case MyVerInfo.dwPlatformId of
    VER_PLATFORM_WIN32s:        OsVersion:='WINDOWS 98';
    VER_PLATFORM_WIN32_WINDOWS: OsVersion:='WINDOWS 98';
    VER_PLATFORM_WIN32_NT:      OsVersion:='Windows NT';
  end;  if OSVERSION='WINDOWS 98'   then
     begin
       case flag of
          0:           ExitWindowsEx(EWX_REBOOT or EWX_SHUTDOWN, 0 );//重新启动
          1:           ExitWindowsEx(EWX_LOGOFF, 0 );//退出重新登陆
          2:           ExitWindowsEx(EWX_POWEROFF, 0 );//用EWX_FORCE是强制关闭
          3:           ExitWindowsEx(EWX_FORCE  or EWX_POWEROFF, 0 );  //强制关机
       end;
       exit;
     end;  if Pos( 'Windows NT', OSVersion ) = 1  then // we've got to do a whole buch of things
     begin
        zero := 0;
        if not OpenProcessToken( GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, hToken) then
           begin
             MessageBox( 0, '错误!', 'OpenProcessToken() Failed', MB_OK );
             Exit;
           end; // if not OpenProcessToken( GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, hToken)        if not OpenProcessToken( GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, hToken) then
           begin
             MessageBox( 0, '错误!', 'OpenProcessToken() Failed', MB_OK );
             Exit;
           end; // if not OpenProcessToken( GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, hToken)        if not LookupPrivilegeValue( nil, 'SeShutdownPrivilege' , tkp.Privileges[ 0 ].Luid ) then
           begin
              MessageBox( 0, '错误!', 'LookupPrivilegeValue() Failed', MB_OK );
              Exit;
           end; // if not LookupPrivilegeValue( nil, 'SeShutdownPrivilege' , tkp.Privileges[0].Luid )
        tkp.PrivilegeCount := 1;
        tkp.Privileges[ 0 ].Attributes := SE_PRIVILEGE_ENABLED;        AdjustTokenPrivileges(hToken, False, tkp, SizeOf(TTokenPrivileges), tkpo, zero );
        if Boolean(GetLastError()) then
           begin
              MessageBox( 0, '错误!', 'AdjustTokenPrivileges() Failed', MB_OK );
              Exit;
           end // if Boolean( GetLastError() )
        else
           case flag of
           0:           ExitWindowsEx(EWX_REBOOT or EWX_SHUTDOWN, 0 );//重新启动
           1:           ExitWindowsEx(EWX_LOGOFF, 0 );//退出重新登陆
           2:           ExitWindowsEx(EWX_POWEROFF, 0 );//用EWX_FORCE是强制关闭
           3:           ExitWindowsEx(EWX_FORCE  or EWX_POWEROFF, 0 );  //强制关机
           end;
      end; // if OSVersion = 'Windows NT'end;